如何在python中从.tar存档中提取特定文件?
我在Linux机器上创建了一个.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
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()