2024-04-26 01:35:01 发布
网友
我做了一个简单的测试代码,它生成了很多整数,并使用gzip模块将它们写入压缩文件。在
import gzip for idx in range(100000): with gzip.open('output.gz', 'ab') as f: line = (str(idx) + '\n').encode() f.write(line)
压缩文件被创建,但当我解压缩它时,原始数据实际上要小得多:
你能解释一下我做错什么了吗?在
附加模式将附加到现有流的假设是错误的。相反,它将一个新的流连接到现有的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的重复,它标志着一个新流的开始。在
1f 8b
一般来说,在循环中以append模式重复打开一个文件通常是个坏主意。相反,打开一次文件进行写入,并在循环中写入内容:
与最初的3mib相比,生成的文件大约为200kib。在
附加模式将附加到现有流的假设是错误的。相反,它将一个新的流连接到现有的gzip文件。解压时,它们会透明地连接起来,就像压缩了一个文件一样。但是每个流都包含它自己的header and footer,这些加起来。检查你的档案
注意幻数
1f 8b
的重复,它标志着一个新流的开始。在一般来说,在循环中以append模式重复打开一个文件通常是个坏主意。相反,打开一次文件进行写入,并在循环中写入内容:
^{pr2}$与最初的3mib相比,生成的文件大约为200kib。在
相关问题 更多 >
编程相关推荐