首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python tarfile中的tar --strip的等效功能,用于随机命名的子文件夹

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

Stack Overflow用户
提问于 2021-04-29 15:22:17
回答 2查看 91关注 0票数 0

我有几个tar文件,目录结构如下:a/b/c/xyz.txt

我想通过忽略父目录'a'来从这些tar文件中提取文件。在提取之后,我期望得到以下目录结构:b/c/xyz.txt

对于tar命令,我们可以使用--strip=1选项。

现在,在Equivalent functionality of tar --strip in python tarfile中,对于一个具有明确名称的目录'a'的tar文件,已经要求这样做,但是我有一个额外的问题。

tarfile 'A'的目录'a'名为'projectname-1d30420',tarfile 'B'的目录名为'differentprojectname-ed1d5db''C'的目录名为'Z',依此类推。

如何在python中使用tarfile实现这一点?

EN

回答 2

Stack Overflow用户

发布于 2021-04-29 17:04:04

如果您有路径a/b/c,那么您可以在第一个/上拆分它,并获取最后一个元素来获取b/c

代码语言:javascript
运行
复制
path = path.split('/', 1)[-1]

您甚至可以使用变量来获得与--strip相同的结果

代码语言:javascript
运行
复制
strip = 1  # 2, 3, etc.

path = path.split('/', strip)[-1]

基于你的链接中的代码,但我没有测试它

代码语言:javascript
运行
复制
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))
票数 1
EN

Stack Overflow用户

发布于 2021-05-02 14:56:42

我已经弄明白了。可以使用member.path = p.relative_to(*p.parts[:strip])这样的pathlib库剥离tar.extractall中的成员文件的解压缩路径,其中p = Path(member.path)strip是剥离的文件夹数。

这将产生以下代码:

代码语言:javascript
运行
复制
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))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67312764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档