Python中os.path.getsize()在with代码块内为何无法正常工作?
文件大小读取差异的原因解析
当调用fun(filename)创建文件并写入文本时,在with代码块内调用print(os.path.getsize(filename))输出0,移到块外则输出正确的文件大小5,背后的原理如下:
代码示例1(块内读取)
import os def fun(filename): with open(filename,'w') as file: file.write("hello") print(os.path.getsize(filename)) fun("newFile2.txt")
代码示例2(块外读取)
import os def fun(filename): with open(filename,'w') as file: file.write("hello") print(os.path.getsize(filename)) fun("newFile2.txt")
核心原因:文件缓冲区机制
这本质是文件缓冲区的优化机制导致的:
- 调用
file.write()时,数据并不会直接写入磁盘,而是先暂存到内存的缓冲区中。操作系统这么设计是为了减少磁盘IO的次数,提升整体性能——毕竟磁盘读写是相对慢速的操作,攒够一定量的数据再一次性写入,效率更高。 - 在
with代码块内部,文件对象还处于打开状态,缓冲区的内容没有被同步到磁盘,此时os.path.getsize()读取的是磁盘上实际存储的文件数据大小,所以显示为0。 - 当
with代码块执行结束时,Python会自动触发文件对象的close()方法。这个方法会强制把缓冲区中暂存的数据刷写到磁盘,同时更新文件的元信息(包括文件大小),这时再调用os.path.getsize()就能读取到磁盘上最新的文件大小,也就是5。
内容的提问来源于stack exchange,提问作者Plessix Stawn
相关产品推荐
相关产品推荐

