You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:15:37