如何使用仅包含数据但没有文件名的python解压缩xz文件?
Posted
技术标签:
【中文标题】如何使用仅包含数据但没有文件名的python解压缩xz文件?【英文标题】:How to unpack xz file with python which contains only data but no filename? 【发布时间】:2017-02-07 00:30:01 【问题描述】:我有一个文件,可以在linux下使用以下命令解压:
unxz < file.xz > file.txt
如何使用 python 做同样的事情? 如果我使用 python3 和 tarfile 模块并执行以下操作:
import sys
import tarfile
try:
with tarfile.open('temp.xz', 'r:xz') as t:
t.extract()
except Exception as e:
print("Error:", e.strerror)
我得到了异常:ReadError('invalid header',)。所以显然它需要一些 xz 文件中不存在的文件或目录信息。
那么如何解压没有头信息的文件呢?
【问题讨论】:
【参考方案1】:tarfile
模块仅适用于... err... tar 文件。你在这里拥有的不是一个。
XZ 支持在 Python 3.3 的 LZMA 模块中可用。在 Python 2.x 中,您需要 backports.lzma
。
try:
import lzma
except ImportError:
from backports import lzma
print lzma.open('file.xz').read()
【讨论】:
这给了我二进制格式的数据。有没有快速解压整个文件的方法?例如,我有一个文件“test.txt.xz”,需要一个命令来获取“test.txt”。一种方法是使用这种方式将二进制格式的数据转换为 utf-8:binary_data_buffer = lzma.open('test.txt.xz').read()
,然后是 string_buffer = binary_data_buffer.decode('utf-8')
,最后将其写入文件。但我很确定有一种更优雅的方法可以做到这一点。
@Pete, lzma.open('test.txt.xz').read().decode('utf-8')
太多了?也就是说,您可以通过 lzma.open('test.txt.xz', mode='rt', encoding='utf-8')
获得开箱即用的多字节字符解码。以上是关于如何使用仅包含数据但没有文件名的python解压缩xz文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 GZipStream 解压缩内存中的 gz 文件?