所以我有这个系统,现在使用 bz2 压缩来抓取和压缩文件。这样做的方式是使用几个月前我在 SO 上找到的以下代码块:
让我们假设为了这篇文章的目的,文件名始终file.XXXX
是XXXX
相关扩展名的位置。我们从.txt
### How to compress a text file
filepath_compressed = "file.tar.bz2"
with open("file.txt", 'rb') as data:
tarbz2contents = bz2.compress(data.read(), 9)
with bz2.BZ2File(filepath_compressed, 'wb') as f_comp:
f_comp.write(tarbz2contents)
现在,要解压它,我总是使用我称为 Keka 的解压软件来工作,该软件将.tar.bz2
文件解压缩为.tar
,然后我再次通过 Keka 运行它以获得一个“无扩展”文件,然后.txt
我在mac 然后就可以了。
现在,要以编程方式进行解压缩,我尝试了一些方法。我已经尝试过这篇文章中的内容和这篇文章中的代码。我试过使用 BZ2Decompressor 和 BZ2File 和一切。我只是似乎遗漏了一些东西,我不确定它是什么。
这是我到目前为止所拥有的,我想知道这段代码有什么问题:
import bz2, tarfile, shutil
# Decompress to tar
with bz2.BZ2File("file.tar.bz2") as fr, open("file.tar", "wb") as fw:
shutil.copyfileobj(fr, fw)
# Decompress from tar to txt
with tarfile.open("file.tar", "r:") as tar:
tar.extractall("file_out.txt")
此代码由于“ tarfile.ReadError: truncated header
”问题而崩溃。我认为第一个上下文管理器输出一个二进制文本文件,我尝试对其进行解码,但也失败了。我在这里想念什么,我觉得自己像个菜鸟。
如果您希望使用最少的可运行代码来复制它,请添加以下内容以创建一个虚拟文件:
lines = ["Line 1","Line 2", "Line 3"]
with open("file.txt", "w") as f:
for line in lines:
f.write(line+"\n")