我正在使用python中的一个项目,我只需要提取tar存档的子文件夹而不是所有文件。 我试着用
tar = tarfile.open(tarfile)
tar.extract("dirname", targetdir)
但是这不起作用,它不提取给定的子目录也没有抛出异常。我是python的初学者。 另外如果上面的函数对于目录不起作用,那么这个命令和tar.extractfile()之间的区别是什么?
答案 0 :(得分:14)
在tarfile module documentation的第二个示例的基础上,您可以使用以下内容提取包含的子文件夹及其所有内容:
with tarfile.open("sample.tar") as tar:
subdir_and_files = [
tarinfo for tarinfo in tar.getmembers()
if tarinfo.name.startswith("subfolder/")
]
tar.extractall(members=subdir_and_files)
这将创建子文件夹及其内容的列表,然后使用推荐的extractall()
方法仅提取它们。当然,将"subfolder/"
替换为要提取的子文件夹的实际路径(相对于tar文件的根目录)。
答案 1 :(得分:6)
另一个答案将保留子文件夹路径,这意味着subfolder/a/b
将被提取到./subfolder/a/b
。要将子文件夹提取到根,因此subfolder/a/b
将被提取到./a/b
,您可以使用以下内容重写路径:
def members(tf):
l = len("subfolder/")
for member in tf.getmembers():
if member.path.startswith("subfolder/"):
member.path = member.path[l:]
yield member
with tarfile.open("sample.tar") as tar:
tar.extractall(members=members(tar))