Python中flush()为何未清空整个文本文件?读取2字符有何影响?
问题分析与解答
核心误解:你完全搞错了flush()的作用
flush()根本不是用来清空文件或重置读取缓冲区的,你的代码现象和flush()毫无关系,完全是对文件读取指针和flush()功能的误解导致的。
具体解释:
flush()的真实用途flush()仅针对写操作的输出缓冲区生效:当你用w/a/w+等可写模式打开文件时,Python会把要写入的内容先暂存到内存缓冲区,等缓冲区满了或者文件关闭时才写入磁盘。flush()的作用是强制把缓冲区里的内容立刻写入磁盘,避免程序意外退出时数据丢失。而你是用
r只读模式打开的文件,此时文件对象没有输出缓冲区,调用flush()不会产生任何效果——既不会清空文件,也不会影响读取操作。你看到的现象的真实原因
第一次调用fileObject.read(2)后,文件的读取指针已经移动到了第2个字符之后(也就是"He"的后面)。此时后续的fileObject.read()会从当前指针位置开始读取剩余内容,所以得到"llo World !"。就算你删掉flush()这行代码,运行结果也完全一样。
如何实现你想要的效果?
- 如果想重置读取位置到文件开头,应该用
seek(0),而不是flush():# 读取2个字符后重置指针到开头 fileObject.seek(0) fileContent = fileObject.read() - 如果想清空文件内容,需要用可写模式打开文件并截断,比如:
# 清空文件 fileObject = open("gfg.txt", "w") fileObject.truncate() fileObject.close()
正确演示flush()的例子
比如展示写操作时缓冲区的刷新:
# 演示flush()对写操作的作用 file = open("test.txt", "w") file.write("Hello") # 此时内容还在缓冲区,打开test.txt看不到内容 file.flush() # 调用flush()后,内容立刻写入磁盘,此时打开test.txt能看到"Hello" file.close()
内容的提问来源于stack exchange,提问作者Dhruvi Joshi
相关产品推荐
相关产品推荐

