没有压缩python模块的gzip文件

2024-04-26 01:35:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我做了一个简单的测试代码,它生成了很多整数,并使用gzip模块将它们写入压缩文件。在

import gzip
for idx in range(100000):
    with gzip.open('output.gz', 'ab') as f:
        line = (str(idx) + '\n').encode()
        f.write(line)

压缩文件被创建,但当我解压缩它时,原始数据实际上要小得多:

^{pr2}$

你能解释一下我做错什么了吗?在


Tags: 模块inimportforoutputwithlinerange
1条回答
网友
1楼 · 发布于 2024-04-26 01:35:01

附加模式将附加到现有流的假设是错误的。相反,它将一个新的流连接到现有的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的重复,它标志着一个新流的开始。在

一般来说,在循环中以append模式重复打开一个文件通常是个坏主意。相反,打开一次文件进行写入,并在循环中写入内容:

^{pr2}$

与最初的3mib相比,生成的文件大约为200kib。在

相关问题 更多 >