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

如何在python中从.tar存档中提取特定文件?,python,tar,tarfile,Python,Tar,Tarfile,我在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_fi

我在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'>
导入文件
以tarfile.open('test.tar','r:')作为tar:
img_file=tar.extractfile('test_folder/file1.jpg'))
#img_文件包含以下对象:

这里,
img_文件
似乎不包含请求的图像,而是包含源
.tar
文件。我不确定,我把事情搞砸了。任何建议都会很有帮助。提前感谢。

这是因为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

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

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()
方法(请参阅我的):


注:

  • 您提取的文件将位于当前目录下的(可能是新创建的)文件夹
    test\u文件夹

  • .extract()
    方法返回
    None
    ,因此不需要分配它(
    img\u file=tar.extract(…)


  • 为什么您认为它包含.tar文件?我刚刚尝试按照您描述的步骤进行操作(尽管我不得不将tar命令的语法更改为
    tar cvf test.tar./test_folder
    ),并且我能够用您的代码提取图像文件,没有任何问题,如果我使用相同的路径,即
    。/test\u folder/filename'
    请注意,必须使用不同的路径是因为在Windows上进行测试,请查看Debian,您的tar语句和Python代码都可以工作-请提供您认为代码不工作的详细原因。是否有理由将
    包含在
    打开的参数中?这是不正确的
    .extractfile()
    不会将文件提取到文件系统中,它提供了一个类似于io.BufferedReader文件的对象,因此它可以在Python中像文件一样使用。您提供的代码只是再次打开以前涂了焦油的原始文件。
    import tarfile
    
    with tarfile.open('test.tar', 'r:') as tar:
        tar.extract('test_folder/file1.jpg')         # .extract()  instead of .extractfile()