【发布时间】:2018-05-22 18:37:52
【问题描述】:
我编写了一个简单的测试代码,它生成大量整数并使用gzip 模块将它们写入压缩文件。
import gzip
for idx in range(100000):
with gzip.open('output.gz', 'ab') as f:
line = (str(idx) + '\n').encode()
f.write(line)
压缩文件已创建,但当我解压缩时,原始数据实际上要小很多:
$ ls -l
588890 output
3288710 output.gz
你能解释一下我在这里做错了什么吗?
【问题讨论】:
-
您将 100000 个单独的时间附加到 gzip 而不是压缩 100000 个项目。交换with语句和for循环的顺序,文件大小为212863。
-
@IljaEverilä 这有什么不同?我希望每次我附加到压缩文件中时,它都会解压缩,附加数据并再次压缩结果。
-
它更类似于将 100000 个单独的 gzip 文件连接在一起。他们的标题等将开始计算。使用您最喜欢的十六进制编辑器并查看文件的内容。您应该会看到大量“输出”字符串等。
-
@IljaEverilä 作为一个有趣的旁注:压缩结果大约是 200 kB,但是当我使用 7z 或 tar.xz 方法手动压缩原始数据时,大小会减少到大约 17 kB。我应该寻找比 gzip 更好的模块。