python文件写入后为空的主因是缓冲区未刷新、编码不匹配、光标位置错误、路径或权限问题;应使用with语句、指定encoding、调用seek(0)、确认工作目录及权限。

文件写入后没刷新缓冲区,内容卡在内存里
Python 的 write() 默认不立即落盘,而是先写进缓冲区。如果程序意外退出、或你用非 with 语句打开又没调 close(),缓冲区里的数据就丢了——文件创建了,但实际没内容。这不是“空白”,是根本没写进去。
常见表现:用记事本、Notepad++ 或 Excel 打开文件,看到空文件;但用 cat 或 Python 自己再读一遍,也读不到东西。
- 用
with open(...)能自动close(),也就顺带刷缓冲区 - 手动打开时,必须显式调
f.close(),不能只靠脚本结束自动回收 - 极端情况(比如调试中断),可加
f.flush()强制刷缓冲,但别滥用——它不保证落盘,close()才是完整收尾
编码不匹配导致乱码被当成空白
你用 utf-8 写入中文,但用 GBK 编码的编辑器(如老版记事本)打开,会显示一堆 或直接空行——不是真空白,是解码失败。Excel 打开 CSV 时也常默认用 ANSI 编码,遇到 UTF-8 内容就全成空格或乱码。
- 写入时明确指定
encoding='utf-8':with open('log.txt', 'w', encoding='utf-8') as f: f.write('你好') - 用 VS Code、Sublime Text 等现代编辑器打开,它们默认识别 UTF-8,不会出问题
- Windows 记事本要「另存为」时选“UTF-8”(不是“UTF-8-BOM”),否则可能加 BOM 头干扰其他工具
文件光标位置错乱,读写不同步
用 'w+' 或 'a+' 模式打开文件后,write() 会把光标移到末尾,紧接着 read() 就从末尾开始读,自然返回空字符串。这容易让人误判“文件是空的”,其实内容已写入,只是读的位置错了。
- 写完想立刻读,必须先
f.seek(0)把光标移回开头 -
'w+'模式会清空原文件,'a+'不清空但光标始终在末尾,两者行为完全不同 - 日常写日志、配置等,用
'w'或'a'即可,没必要用+模式混读写
路径写错或权限不足,写进了别的地方
代码里写 open('data.txt', 'w'),你以为文件在当前目录,其实它被写到了 Python 进程的当前工作目录(os.getcwd()),而不是脚本所在目录(__file__)。如果你从其他路径运行脚本,或者用 IDE 启动时工作目录设得不对,文件就生成在你看不见的地方——你反复检查的“那个 data.txt”根本不是它。
- 用绝对路径或基于脚本位置拼路径:
os.path.join(os.path.dirname(__file__), 'data.txt') - 写入前加一句
print(os.getcwd()),确认当前工作目录是不是你预期的 - Linux/macOS 下注意权限:目标目录是否可写?Windows 下文件是否被其他程序(如 Excel)独占锁住?
print(open('xxx.txt').read())——这一步能快速区分是写入失败,还是显示问题。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











