我正在试验Python 2.7.6中的lzma模块,看看我是否可以使用XZ格式为将来使用它的项目创建压缩文件。我在实验期间使用的代码是:
import lzma as xz
in_file = open('/home/ki2ne/Desktop/song.wav', 'rb')
input_data = in_file.read()
compressed_data = xz.compress(input_data)
out_file = open('/home/ki2ne/Desktop/song.wav.xz', 'wb')
in_file.close()
out_file.close()
我发现结果文件中有两个不同的校验和(MD5和SHA256)与使用普通xz时相比(虽然我可以用任何一种方法解压缩 - 两个文件的解压缩版本的校验和是相同的)。这会有问题吗?
更新:我通过peterjc的Git存储库(link here)安装backport(来自Python 3.3)找到了解决方法,现在它显示了相同的校验和。不确定它是否有帮助,但我确保没有安装我的存储库中的LZMA Python模块以避免可能的名称冲突。
这是我的测试代码,以确认这一点:
# I have created two identical text files with some random phrases
from subprocess import call
from hashlib import sha256
from backports import lzma as xz
f2 = open("test2.txt" , 'rb')
f2_buf = buffer(f2.read())
call(["xz", "test1.txt"])
f2_xzbuf = buffer(xz.compress(f2_buf))
f1 = open("test1.txt.xz", 'rb')
f1_xzbuf = buffer(f1.read())
f1.close(); f2.close()
f1sum = sha256(); f2sum = sha256()
f1sum.update(f1_xzbuf); f2sum.update(f2_xzbuf)
if f1sum.hexdigest() == f2sum.hexdigest():
print "Checksums OK"
else:
print "Checksum Error"
我也使用常规sha256sum验证了它(当我将数据写入文件时)。
答案 0 :(得分:5)
我不会担心压缩文件的差异 - 根据容器格式和.xz
文件中使用的校验和类型,压缩数据可能会有所不同而不会影响内容。
编辑我一直在深入研究这个问题,并编写了这个脚本来测试PyLZMA Python2.x模块和模块内置的lzma Python3.x
from __future__ import print_function
try:
import lzma as xz
except ImportError:
import pylzma as xz
import os
# compress with xz command line util
os.system('xz -zkf test.txt')
# now compress with lib
with open('test.txt', 'rb') as f, open('test.txt.xzpy', 'wb') as out:
out.write(xz.compress(bytes(f.read())))
# compare the two files
from hashlib import md5
with open('test.txt.xz', 'rb') as f1, open('test.txt.xzpy', 'rb') as f2:
hash1 = md5(f1.read()).hexdigest()
hash2 = md5(f2.read()).hexdigest()
print(hash1, hash2)
assert hash1 == hash2
这会使用test.txt
命令行实用程序和Python模块压缩文件xz
并比较结果。在Python3下,lzma产生与xz
相同的结果,但是在Python2下,PyLZMA产生的结果不同,无法使用xz命令行util提取。
你使用的是什么模块,在Python2中称为“lzma”,你用什么命令来压缩数据?
编辑2 好的,我找到了Python2的pyliblzma模块。但是它似乎使用CRC32作为默认校验和算法(其他人使用CRC64)并且有一个错误阻止更改校验和算法https://bugs.launchpad.net/pyliblzma/+bug/1243344
你可以尝试使用xz -C crc32
进行压缩来比较结果,但是我仍然没有成功使用Python2库制作有效的压缩文件。
答案 1 :(得分:0)
在我的情况下(Ubuntu / Mint),为了在Pyhton 2.7中使用lzma
模块,我直接在backports.lzma
上安装了pip
(我没有使用过github), sudo
或 root 用户:
pip2 install backports.lzma
FYI pip2
具有--user
选项,该选项不需要超级用户权限,并且仅为本地用户安装模块,但是我尚未对此进行测试。
除了执行pip
安装之外,还必须使用包管理器安装一个强制性依赖项:库liblzma
。
在我的情况下,软件包名称分别为liblzma5
和liblzma-dev
,但是Linux发行版/发行版之间的软件包名称可能有所不同。
P.s:我还成功地在不同的Linux环境(未知集群发行版)上用conda
重复了相同的操作:
conda install backports
conda install backports.lzma --name pyEnvName
希望有用