如何从 python 中的 .tar 存档中提取特定文件?

How to extract a specific file from the .tar archive in python?

我在 Linux 机器上创建了一个 .tar 文件,如下所示:

tar cvf test.tar test_folder/

其中 test_folder 包含一些文件,如下所示:

test_folder 
|___ file1.jpg
|___ file2.jpg
|___ ...

我无法使用 Python 以编程方式提取 tar 存档中的单个文件。更具体地说,我尝试了以下方法:

import tarfile
with tarfile.open('test.tar', 'r:') as tar:
    img_file = tar.extractfile('test_folder/file1.jpg')
    # img_file contains the object: <ExFileObject name='test_folder/test.tar'>

此处,img_file 似乎不包含请求的图像,而是包含源 .tar 文件。我不确定,我在哪里搞砸了。任何建议都会很有帮助。提前致谢。

这是因为 extractfile() returns 一个 io.BufferReader 对象,所以本质上你是在你的目录中提取文件并将 io.BufferReader 存储在你的变量中。

您可以做的是,解压缩文件,然后在不同的内容管理器中打开文件

import tarfile
with tarfile.open('test.tar', 'r:') as tar:
    tar.extractfile('test_folder/file1.jpg')

with open('test_folder/file1.jpg','rb') as img:
    # do something with img. Here img is your img file

在您的代码中添加 2 行即可解决您的问题:

import tarfile

with tarfile.open('test.tar', 'r:') as tar:
    img_file = tar.extractfile('test_folder/file1.jpg')
    
    # --------------------- Add this ---------------------------
    with open ("img_file.jpg", "wb") as outfile:
        outfile.write(img_file.read())

解释:

.extractfile() 方法只为您提供了提取文件的 内容(即它的 数据)。

不提取任何文件到文件系统。

所以你已经做到了 你自己 - 通过读取返回的内容 (img_file.read()) 并将其写入你选择的文件 (outfile.write(...)) .


或者——为了简化您的生活——改用 .extract() 方法。参见

您可能想使用 .extract() 方法而不是 .extractfile() 方法(参见我的 ):

import tarfile

with tarfile.open('test.tar', 'r:') as tar:
    tar.extract('test_folder/file1.jpg')         # .extract()  instead of .extractfile()

备注:

  1. 您提取的文件将位于您当前目录下的(可能是新创建的)文件夹 test_folder 中。

  2. .extract()方法returnsNone,所以不用赋值(img_file = tar.extract(...))