使用 Python 从仅具有基本名称的 tarfile 中提取文件

Posted

技术标签:

【中文标题】使用 Python 从仅具有基本名称的 tarfile 中提取文件【英文标题】:Extracting file from tarfile with only basename using Python 【发布时间】:2011-05-27 08:04:09 【问题描述】:

我有一个“tafile”,其中包含具有完整路径“/home/usr/path/to/file”的文件。当我将文件提取到当前文件夹时,它会递归地创建完整路径。 有没有办法可以只提取基本名称的文件。

【问题讨论】:

【参考方案1】:

您可以通过破解您从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',而只是添加它的成员。

【讨论】:

【参考方案2】:

使用TarFile.extractfile() 并将其写入您选择的文件中。

【讨论】:

这是一个解决方案,但我宁愿重命名文件而不是复制每一行。 你不能不“复制每一行”,因为这就是提取的完成方式。 shutil.copyfileobj 是一个方便自己复制的工具。【参考方案3】:

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

TarFile.extractall(path="my/path")

【讨论】:

“tarfile”不是由我创建的。有没有办法在创建 tarfile 后更改 arcname? 是的,对不起,这是我仔细阅读后才知道的!请查看我的编辑,它应该更符合您的需求。 它仍然递归地创建文件夹,就像在 'my/path//home/usr/path/to/file' 中一样。

以上是关于使用 Python 从仅具有基本名称的 tarfile 中提取文件的主要内容,如果未能解决你的问题,请参考以下文章

如何从仅使用空格作为分隔符的文件中获取要写入的二维数组

Facebook App Review:从仅服务器应用程序中获取屏幕截图?

从仅给定一个属性的 ArrayList 中删除对象

无法使用 Python 在 Windows 上找到具有长名称的文件

python函数可以调用具有相同名称的全局函数吗?

Azure Vm 备份 - 从仅 OS 磁盘更改为所有磁盘