我正在尝试在Python3.6.8中gzip一个numpy数组
如果我运行此代码段两次(不同的解释器会话),将得到不同的输出:
import gzip
import numpy
import base64
data = numpy.array([[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0], [9.0, 10.0, 11.0, 12.0], [13.0, 14.0, 15.0, 16.0]])
compressed = base64.standard_b64encode(gzip.compress(data.data, compresslevel=9))
print(compressed.decode('ascii'))
示例结果(每次都不同):
H4sIAPjHiV4C/2NgAIEP9gwQ4AChOKC0AJQWgdISUFoGSitAaSUorQKl1aC0BpTWgtI6UFoPShs4AABmfqWAgAAAAA==
H4sIAPrHiV4C/2NgAIEP9gwQ4AChOKC0AJQWgdISUFoGSitAaSUorQKl1aC0BpTWgtI6UFoPShs4AABmfqWAgAAAAA==
^
在循环中运行它(因此相同的解释器会话),每次都会给出相同的结果
for _ in range(1000):
assert compressed == base64.standard_b64encode(gzip.compress(data.data, compresslevel=9))
如何每次都得到相同的结果?(最好没有外部库。)
Gzip在压缩时使用一些文件信息(inode、时间戳等)(关于here的讨论很好)。您不使用文件本身,但仍然在不同的时间使用它。因此,这可能会产生效果(看看Python的gzip包装器,实际上可以提供更好的洞察力,但这是我无法理解的:)
因此,如果您有Python3.8+,请尝试在
gzip.compress(data.data, compresslevel=9)
中使用mtime=0
参数,如下所示:如果这不起作用(例如,较旧的Python版本),则可以将
gzip.GzipFile
与mtime
参数一起使用,如下所示:有关详细信息,文档为here:
相关问题 更多 >
编程相关推荐