如何从 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()
备注:
您提取的文件将位于您当前目录下的(可能是新创建的)文件夹 test_folder
中。
.extract()
方法returnsNone
,所以不用赋值(img_file = tar.extract(...)
)
我在 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()
备注:
您提取的文件将位于您当前目录下的(可能是新创建的)文件夹
test_folder
中。.extract()
方法returnsNone
,所以不用赋值(img_file = tar.extract(...)
)