python tarfile中tar--strip的等效功能,用于随机命名的子文件夹
我有几个目录结构如下的tar文件:python tarfile中tar--strip的等效功能,用于随机命名的子文件夹,python,tarfile,Python,Tarfile,我有几个目录结构如下的tar文件:a/b/c/xyz.txt 我想通过忽略父目录'a'从这些tar文件中提取文件。提取后,我希望得到以下目录结构:b/c/xyz.txt 使用tar命令,我们可以使用--strip=1选项 现在,在一个tar文件中,有一个清晰命名的目录'a',之前有人问过这个问题,但我有一个额外的问题 tarfile'a'的目录'a'被命名为'projectname-1d30420',对于tarfile'B'它是'differentitprojectname-ed1d5db',对
a/b/c/xyz.txt
我想通过忽略父目录'a'
从这些tar文件中提取文件。提取后,我希望得到以下目录结构:b/c/xyz.txt
使用tar命令,我们可以使用--strip=1
选项
现在,在一个tar文件中,有一个清晰命名的目录'a'
,之前有人问过这个问题,但我有一个额外的问题
tarfile'a'
的目录'a'
被命名为'projectname-1d30420'
,对于tarfile'B'
它是'differentitprojectname-ed1d5db'
,对于'C'
到'Z'
,依此类推
如何在python中使用tarfile实现这一点?如果您有路径
a/b/c
,那么您可以首先拆分它/
,然后获取最后一个元素以获取b/c
path = path.split('/', 1)[-1]
您甚至可以使用变量获得与--strip
strip = 1 # 2, 3, etc.
path = path.split('/', strip)[-1]
基于你链接中的代码,但我没有测试它
def members(tar, strip):
for member in tar.getmembers():
member.path = member.path.strip('/', strip)[-1]
yield member
# --- main ---
strip = 1
with tarfile.open("sample.tar") as tar:
tar.extractall(members=members(tar, strip))
如果您有路径
a/b/c
,则可以在第一个/
上拆分它,并获取最后一个元素以获取b/c
path = path.split('/', 1)[-1]
您甚至可以使用变量获得与--strip
strip = 1 # 2, 3, etc.
path = path.split('/', strip)[-1]
基于你链接中的代码,但我没有测试它
def members(tar, strip):
for member in tar.getmembers():
member.path = member.path.strip('/', strip)[-1]
yield member
# --- main ---
strip = 1
with tarfile.open("sample.tar") as tar:
tar.extractall(members=members(tar, strip))
我已经弄明白了。
tar.extractall中的成员文件可以使用pathlib库剥离其提取路径,如somember.path=p.relative_to(*p.parts[:strip])
其中p=path(member.path)
和strip
是剥离的文件夹数
这将产生以下代码:
import tarfile
from pathlib import Path
def get_tar_members_stripped(tar, n_folders_stripped = 1):
members = []
for member in tar.getmembers():
p = Path(member.path)
member.path = p.relative_to(*p.parts[:n_folders_stripped])
members.append(member)
return members
# --- main ---
strip = 1
with tarfile.open(tarfile_path, 'r') as tar:
tar.extractall(members=get_tar_members_stripped(tar, strip))
我已经弄明白了。
tar.extractall中的成员文件可以使用pathlib库剥离其提取路径,如somember.path=p.relative_to(*p.parts[:strip])
其中p=path(member.path)
和strip
是剥离的文件夹数
这将产生以下代码:
import tarfile
from pathlib import Path
def get_tar_members_stripped(tar, n_folders_stripped = 1):
members = []
for member in tar.getmembers():
p = Path(member.path)
member.path = p.relative_to(*p.parts[:n_folders_stripped])
members.append(member)
return members
# --- main ---
strip = 1
with tarfile.open(tarfile_path, 'r') as tar:
tar.extractall(members=get_tar_members_stripped(tar, strip))
如果你有路径
a/b某个/a/b
,那么你总是可以使用path.split('/',1)[1]
只获取a/b
,你甚至可以把它写成path.split('/',strip)[-1]
如果你有路径something/a/b
,那么你总是可以使用path.split('/',1]
要仅获取a/b
甚至可以将其编写为path.split('/',strip)[-1]
strip对我不起作用,所以我使用了pathlib。如果你复制我在下面的编辑,我会接受你的答案,这是你的功劳。顺便说一句,我不能让收益率工作。我没有tar文件来测试代码,所以我只是在猜测。请描述您的答案,并将您的答案标记为acceptedStrip不适用于我,因此我使用了pathlib。如果你复制我在下面的编辑,我会接受你的答案,这是你的功劳。顺便说一句,我不能让收益率工作。我没有tar文件来测试代码,所以我只是在猜测。描述您的答案并将您的答案标记为已接受