我正在用Python2.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()
我注意到,与使用普通xz时相比,结果文件中有两个不同的校验和(MD5和SHA256)(尽管使用两种方法都可以很好地解压缩—两个文件的解压缩版本的校验和是相同的)。这会有问题吗?
更新:我通过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(当我将数据写入文件时)验证了它。
在我的例子中(Ubuntu/Mint),为了在Pyhton 2.7中使用
lzma
模块,我直接用pip
(我没有使用github)、用sudo
或root用户安装了backports.lzma
:FYI
pip2
具有不需要超级用户权限的--user
选项,并且仅为本地用户安装模块,但我尚未对此进行测试。首先,除了执行
pip
安装之外,还必须使用包管理器安装一个强制依赖关系:库liblzma
。在我的例子中,包名是
liblzma5
和liblzma-dev
,但是不同的Linux发行版/发行版的包名可能不同。p.s:我还在不同的Linux环境(未知的群集发行版)上使用
conda
成功地重复了相同的操作:希望有用
我不担心压缩文件中的差异-根据容器格式和
.xz
文件中使用的校验和类型,压缩数据可能会在不影响内容的情况下发生变化。编辑我进一步研究了这个问题,并编写了这个脚本来测试PyLZMA Python2.x模块和lzma Python3.x内置模块
这将使用
xz
命令行实用程序和Python模块压缩文件test.txt
,并比较结果。在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库生成有效的压缩文件。相关问题 更多 >
编程相关推荐