8.4.3 从归档抽取文件
要在程序中访问一个归档成员的数据,可以使用extractfile()方法,并且传入这个成员名。
import tarfile
with tarfile.open('example.tar','r') as t:
for filename in ['README.txt','notthere.txt']:
try:
f = t.extractfile(filename)
except KeyError:
print('ERROR: Did not find {} in tar archive'.format(
filename))
else:
print(filename,':')
print(f.read().decode('utf-8'))
返回值是一个类似文件的对象,可以从这个对象读取归档成员的内容。
运行结果:
要解开归档并将文件写至文件系统,可以使用extract()或extractall()。
import tarfile
import os
os.mkdir('outdir')
with tarfile.open('example.tar','r') as t:
t.extract('README.txt','outdir')
print(os.listdir('outdir'))
会从归档中读出归档成员,并写至文件系统(从参数中指定的目录开始)。
运行结果:
标准库文档中一个说明,指出extractall()比extract()更安全,特别是处理流数据时,这是因为对于流数据来说,无法回转输入而去读之前的部分。大多数情况下都应该使用extractall()。
import tarfile
import os
os.mkdir('outdir2')
with tarfile.open('example.tar','r') as t:
t.extractall('outdir2')
print(os.listdir('outdir2'))
使用extractall()时,第一个参数是一个目录名,文件将写至这个目录。
运行结果:
要从归档中抽取特定的文件,可以把这些文件名或TarInfo元数据容器传递到extractall()。
import tarfile
import os
os.mkdir('outdir3')
with tarfile.open('example.tar','r') as t:
t.extractall('outdir3',
members=[t.getmember('README.txt')],
)
print(os.listdir('outdir3'))
如果提供了一个members列表,就只抽取指定的文件。
运行结果: