我制作了一个简单的测试代码,它生成了很多整数,并使用gzip模块将它们写入压缩文件。
container->setParameter('abc','ABC')
创建了压缩文件但是当我解压缩时,原始数据实际上要小得多:
import gzip
for idx in range(100000):
with gzip.open('output.gz', 'ab') as f:
line = (str(idx) + '\n').encode()
f.write(line)
请你解释我在这里做错了什么?
答案 0 :(得分:3)
附加模式附加到现有流的假设是错误的。相反,它将新流连接到现有的gzip文件。解压缩这些后,然后透明地连接,就像压缩了单个文件一样。但是每个流都包含自己的header and footer并且这些加起来。检查您的文件显示
% hexdump -C output.gz|head -n5
00000000 1f 8b 08 08 2e e7 03 5b 02 ff 6f 75 74 70 75 74 |.......[..output|
00000010 00 33 e0 02 00 12 cd 4a 7e 02 00 00 00 1f 8b 08 |.3.....J~.......|
00000020 08 2e e7 03 5b 02 ff 6f 75 74 70 75 74 00 33 e4 |....[..output.3.|
00000030 02 00 53 fc 51 67 02 00 00 00 1f 8b 08 08 2e e7 |..S.Qg..........|
00000040 03 5b 02 ff 6f 75 74 70 75 74 00 33 e2 02 00 90 |.[..output.3....|
请注意重复的幻数1f 8b
,它标记了新流的开头。
通常,在循环中以附加模式重复打开文件通常是个坏主意。而是打开文件一次以写入并在循环中写入内容:
with gzip.open('output.gz', 'wb') as f:
for idx in range(100000):
line = (str(idx) + '\n').encode()
f.write(line)
与原始的3 MiB相比,生成的文件大约为200 kiB。