第八章:数据压缩与归档-tarfile:tar归档访问-从归档抽取文件

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列表,就只抽取指定的文件。
运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43193719/article/details/89278765