使用Python从只有basename的tarfile中提取文件

使用Python从只有basename的tarfile中提取文件,python,tarfile,Python,Tarfile,我有一个“tafile”,其中包含具有完整路径“/home/usr/path/to/file”的文件。当我将文件解压缩到curent文件夹时,它会递归地创建完整的路径。 是否有一种方法可以仅使用基本名称提取文件。使用并将其写入您选择的文件。使用并将其写入您选择的文件。您可以使用函数extractall,以满足您的需要。根据: 将存档中的所有成员提取到当前工作目录或目录路径 您可以使用功能extractall来满足您的需要。根据: 将存档中的所有成员提取到当前工作目录或目录路径 通过对从Tarfi

我有一个“tafile”,其中包含具有完整路径“/home/usr/path/to/file”的文件。当我将文件解压缩到curent文件夹时,它会递归地创建完整的路径。
是否有一种方法可以仅使用基本名称提取文件。

使用并将其写入您选择的文件。

使用并将其写入您选择的文件。

您可以使用函数
extractall
,以满足您的需要。根据: 将存档中的所有成员提取到当前工作目录或目录路径


您可以使用功能
extractall
来满足您的需要。根据: 将存档中的所有成员提取到当前工作目录或目录路径


通过对从
Tarfile.getmembers()获取的
TarInfo
对象进行黑客攻击,可以更改
arcnames
。然后,您可以使用
Tarfile.extractall
将成员以新名称写入您选择的目的地

例如,以下函数将从存档的任意子树中选择成员,并将其提取到其基本名称下的目标:

def extractTo(tar, dest, selector):
    if type(selector) is str:
        prefix = selector
        selector = lambda m: m.name.startswith(prefix)
    members = [m for m in tar.getmembers() if selector(m)]
    for m in members:
        m.name = os.path.basename(m.name)
    tar.extractall(path = dest, members = members)
假设
tar
是一个
TarFile
实例,表示在
utilities/misc
目录中有一些成员的存档,您希望将这些成员折叠到
local/bin
目录中。你可以做:

extractTo(tar, 'local/bin', 'utilities/misc/')

注意目录前缀后面的
/
。我们不想将
misc
目录添加到'local/bin',而只想添加其成员。

您可以通过对从
Tarfile.getmembers()获取的
TarInfo
对象进行黑客攻击来更改
arcnames
。然后,您可以使用
Tarfile.extractall
将成员以新名称写入您选择的目的地

例如,以下函数将从存档的任意子树中选择成员,并将其提取到其基本名称下的目标:

def extractTo(tar, dest, selector):
    if type(selector) is str:
        prefix = selector
        selector = lambda m: m.name.startswith(prefix)
    members = [m for m in tar.getmembers() if selector(m)]
    for m in members:
        m.name = os.path.basename(m.name)
    tar.extractall(path = dest, members = members)
假设
tar
是一个
TarFile
实例,表示在
utilities/misc
目录中有一些成员的存档,您希望将这些成员折叠到
local/bin
目录中。你可以做:

extractTo(tar, 'local/bin', 'utilities/misc/')

注意目录前缀后面的
/
。我们不想将
misc
目录添加到'local/bin',而只想添加其成员。

我没有创建'tarfile'。有没有办法在创建tarfile后更改arcname?是的,对不起,这是我在仔细阅读后发现的!请查看我的编辑,它应该更适合您的需要。它仍然以递归方式创建文件夹,如“my/path//home/usr/path/to/file”。我没有创建“tarfile”。有没有办法在创建tarfile后更改arcname?是的,对不起,这是我在仔细阅读后发现的!请查看我的编辑,它应该更适合您的需要。它仍然以递归方式创建文件夹,如“my/path//home/usr/path/to/file”。这是一个解决方案,但我更希望重命名文件,而不是复制每一行。您会情不自禁地“复制每一行”,因为提取就是这样完成的
shutil.copyfileobj
是一个方便的工具,可以自己复制。这是一个解决方案,但我更愿意重命名文件,而不是复制每一行。你不得不“复制每一行”,因为提取就是这样做的
shutil.copyfileobj
是一个方便的工具,可以自己进行复制。