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

2024-04-23 17:31:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

tar cvf test.tar test_folder/

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

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文件。我不确定,我把事情搞砸了。任何建议都会很有帮助。提前谢谢


Tags: 文件test文件夹机器imglinux编程tar
3条回答

在代码中添加两行将解决您的问题:

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()方法。见my other answer

这是因为extractfile()返回一个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

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

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()方法返回None,因此不需要分配它(img_file = tar.extract(...)

相关问题 更多 >