flush刷新的是缓冲区里的待写入数据,确保print或write的数据立即发送至文件、终端或网络,而非延迟等待缓冲区满或程序结束。

Python 中的 flush 刷新的是**缓冲区里的待写入数据**,不是屏幕、页面或变量内容。它把还“卡”在内存缓冲区里、还没真正落到文件或终端上的数据,立刻推送给底层目标(比如磁盘文件、控制台、网络连接等)。
刷新的对象是缓冲区,不是终端画面
很多人误以为 flush 是“清屏”或“重绘”,其实不是。它不删除旧文字、不移动光标、不改变已显示的内容——只是确保你调用 print() 或 write() 时产生的数据,不再等缓冲区凑满或程序结束,而是马上发出去。
- 对文件:数据从 Python 缓冲区写入操作系统缓存,再由系统决定何时落盘(
flush()不等于os.fsync()) - 对终端(
sys.stdout):数据从缓冲区送至终端程序(如 Terminal、CMD),让它立刻渲染出来 - 对网络 socket:把待发送的数据从应用层缓冲区交给操作系统协议栈准备发包
为什么默认要缓冲?
频繁直接读写磁盘或终端开销大。缓冲是性能优化手段:攒几条输出一起发,比每 print 一次就跑一趟系统调用快得多。但代价是“延迟可见”——你看到的不是实时结果,而是缓冲区“愿意给你看”的时候。
- 例如:
print("Loading...")后没换行、也没flush=True,终端可能一动不动,直到程序结束才突然弹出 - 又如:写日志文件时,若进程意外崩溃且未 flush,最后几条日志就丢了
怎么判断要不要 flush?
关键看“你是否需要别人(人或另一个程序)立刻看到/收到这些数据”:
立即学习“Python免费学习笔记(深入)”;
- 进度提示(如下载、循环处理)→ 必须 flush,否则用户以为卡住
- 日志记录关键状态(如“开始备份”“校验失败”)→ 建议 flush,避免故障时丢失上下文
- 写大文件批量数据 → 通常不用每次 flush,影响性能;可在关键节点(如每万条)或 close 前调用
- 交互式命令行工具(如 CLI 菜单)→ 每次输出后 flush,保证响应感
常用刷新方式对比
有三种主流做法,适用场景略有不同:
-
print(..., flush=True):最简洁,Python 3.3+ 推荐,适合终端输出 -
sys.stdout.flush():兼容老版本,或需在 write() 后手动刷(sys.stdout.write("..."); sys.stdout.flush()) -
file_obj.flush():操作普通文件对象时显式调用,尤其配合open(..., buffering=1)或buffering=0(仅二进制)时更可控










