从tar中提取单个目录(用python)
我正在做一个Python项目,需要从一个tar压缩包中只提取一个子文件夹,而不是所有的文件。
我尝试使用了
tar = tarfile.open(tarfile)
tar.extract("dirname", targetdir)
但是这个方法不管用,它没有提取出指定的子目录,而且也没有抛出任何异常。我还是Python的初学者。
另外,如果上面的函数对目录不管用,那这个命令和tar.extractfile()有什么区别呢?
2 个回答
16
另一个回答会保留子文件夹的路径,这意味着 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))
22
在这个例子中,我们是基于tarfile模块的文档的第二个例子,你可以用下面的方式提取里面的子文件夹及其所有内容:
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文件的根目录)。