Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python tarfile中tar--strip的等效功能,用于随机命名的子文件夹_Python_Tarfile - Fatal编程技术网

python tarfile中tar--strip的等效功能,用于随机命名的子文件夹

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',对

我有几个目录结构如下的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'
,对于
'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库剥离其提取路径,如so
member.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库剥离其提取路径,如so
member.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文件来测试代码,所以我只是在猜测。描述您的答案并将您的答案标记为已接受