如何*正确*使用 bz2 和 python 压缩和解压缩文本文件

问题描述

所以我有这个系统,现在使用 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 运行它以获得一个“无扩展名”文件,然后我在我的 mac 上添加一个 .txt,然后它就可以工作了。

现在,为了以编程方式进行解压缩,我尝试了一些方法。我已经尝试过 this post 中的内容和 this post 中的代码。我试过使用 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")

解决方法

您制作的不是 .tar.bz2 文件,而是 .bz2.bz2 文件。您正在使用 bzip2 压缩两次(第二次没有效果),并且在任何地方都看不到 tar 文件生成。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...