
python中用`'w'`模式反复打开文件会导致前次写入内容被清空,应改用`with open(..., 'w')`一次性打开文件写入,或使用`'a'`追加模式配合预清理。
在Python中,文件打开模式决定了数据如何写入磁盘。你遇到的问题根源在于:每次循环中使用 'w'(write)模式调用 open('stars.txt', 'w'),都会截断(即清空)已有文件内容并重新开始写入。因此,尽管控制台能完整打印所有 star,但文件中最终只保留了最后一次循环写入的那一条记录。
✅ 正确做法是:将文件打开操作移出循环,在整个写入过程开始前一次性打开,结束后统一关闭。推荐使用 with 语句,它不仅语法简洁,还能确保即使发生异常,文件也会被安全关闭:
with open('stars.txt', 'w', encoding='utf-8') as sourceFile:
for star in Constellation_data(starDf.values.tolist()):
print(star) # 输出到控制台
print(star, file=sourceFile) # 同步写入文件
# 文件在此自动关闭,无需手动调用 .close()⚠️ 注意事项:
- 显式指定 encoding='utf-8' 可避免中文或特殊字符写入时报错(尤其在Windows系统上);
- print(..., file=f) 默认会在每行末尾添加换行符 \n,行为与 f.write(str(star) + '\n') 一致;
- 若需更精细控制(如不换行、自定义分隔符),可改用 sourceFile.write() 配合手动格式化。
? 替代方案(仅在特殊场景下使用):
若因外部进程需实时读取文件、或需保证每次写入后立即落盘(如日志监控),可采用 'a'(append)模式——但必须先清除旧文件,否则会持续累积:
import os
if os.path.exists('stars.txt'):
os.remove('stars.txt')
for star in Constellation_data(starDf.values.tolist()):
print(star)
with open('stars.txt', 'a', encoding='utf-8') as sourceFile:
print(star, file=sourceFile)? 总结:文件 I/O 应遵循“一次打开、批量写入、自动关闭”原则。滥用 'w' 模式循环打开是初学者常见误区;而 with 语句+合理文件模式('w' 或 'a')是兼顾健壮性、可读性与性能的最佳实践。










