Python gzip.open在Windows写入后文件为空,是否未完全实现?
关于gzip写入后文件为空的问题解答
这既不是Windows系统的预期行为,也不是Python的bug,问题出在代码未正确处理文件对象的关闭操作。
原因分析
Python的文件I/O(包括gzip模块封装的文件对象)会使用内存缓冲区提升性能。调用write()后,数据仅写入缓冲区,并未立刻同步到磁盘。只有当文件对象被关闭时,缓冲区内容才会被写入磁盘,同时完成gzip文件的收尾工作(如写入校验和、文件头信息等)。
你提供的代码中,gzip.open(...)创建的文件对象在调用write()后直接被丢弃,此时Python的垃圾回收机制尚未触发文件关闭操作,因此读取文件大小会得到0。即使用with语句,若未正确控制代码执行顺序(比如在with块内就读取文件大小),也会出现同样问题。
正确写法示例
推荐使用with语句自动管理文件生命周期,确保文件被正确关闭:
import os import gzip data = b'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.' with gzip.open('D:\\tmp\\try1.gz', 'wb') as f: written = f.write(data) # with块结束后文件自动关闭,此时再读取文件大小 compressed_written = os.stat('D:\\tmp\\try1.gz').st_size print("theoretically written", written, "B, compressed size is", compressed_written, "B")
关于bug上报
当前场景不属于bug,无需上报。若确认使用正确代码仍出现异常,可通过Python官方的bug跟踪系统提交问题,但此情况极少发生。
内容的提问来源于stack exchange,提问作者Oded R.
相关产品推荐
相关产品推荐

