【问题标题】:I want to extract a .tgz file and extract any subdirectories that have files that are .tgz and .tar我想提取一个 .tgz 文件并提取任何具有 .tgz 和 .tar 文件的子目录
【发布时间】:2011-05-19 12:45:05
【问题描述】:

我正在使用下面的代码来提取.tgz 文件。我需要提取的日志文件类型 (.tgz) 具有包含其他 .tgz 文件和 .tar 文件的子目录。我也想提取那些。

最终,我试图在所有.log 文件和.txt 文件中搜索可能出现在.tgz 文件中的某些字符串。

下面是我用来提取.tgz 文件的代码。我一直在尝试解决如何提取子文件(.tgz.tar)。到目前为止,我一直没有成功。

import os, sys, tarfile

try:
    tar = tarfile.open(sys.argv[1] + '.tgz', 'r:gz')
    for item in tar:
        tar.extract(item)
    print 'Done.'
except:
    name = os.path.basename(sys.argv[0])
    print name[:name.rfind('.')], '<filename>'

【问题讨论】:

  • 这似乎是一个很好的递归用例。您向函数提供第一个 tar 文件,如果它遇到另一个 tar 文件,则该函数将使用新的 tar 文件调用自身。如果你找到一个日志文件,你可以调用另一个处理日志文件的函数。

标签: python gzip tar compression


【解决方案1】:

这应该会给你想要的结果:

import os, sys, tarfile

def extract(tar_url, extract_path='.'):
    print tar_url
    tar = tarfile.open(tar_url, 'r')
    for item in tar:
        tar.extract(item, extract_path)
        if item.name.find(".tgz") != -1 or item.name.find(".tar") != -1:
            extract(item.name, "./" + item.name[:item.name.rfind('/')])
try:

    extract(sys.argv[1] + '.tgz')
    print 'Done.'
except:
    name = os.path.basename(sys.argv[0])
    print name[:name.rfind('.')], '<filename>'

正如@cularis 所说,这称为递归。

【讨论】:

  • 代码解压 .tgz 文件并显示一个文件夹 - 'storage',在该文件夹中还有另外两个文件夹 = 'Folder1' 和 'Folder'2,它们都有 .tgz 文件和.tar 文件尚未解压缩。上面的代码只是解压主 .tgz 文件,而不是子文件夹中的文件。
  • 抱歉,我忘记了 tar 文件。代码已更新。尽管如此,它还是将 .tgz 解压缩到子文件夹中。现在它适用于嵌套在存档中的 .tar 和 .tgz 文件。
  • 我如何将相同的代码作为脚本而不是从 cmd 行执行?谢谢!
  • 作为脚本执行是什么意思?您希望如何启动它以及您希望脚本如何运行?
最近更新 更多