【问题标题】:I want to extract all .tgz and .tar files in a single directory我想在一个目录中提取所有 .tgz 和 .tar 文件
【发布时间】:2011-06-10 18:51:40
【问题描述】:

我正在使用以下代码将 .tgz 和 .tar 文件提取到存档文件所在的同一目录中。它适用于单个文件。但是,当我选择同一目录中的另一个文件进行提取时,当前文件夹将被覆盖(所有文件都提取一个名为 storage 的根文件夹)。我想这就是文件被覆盖的原因。所以,我每次只能在目录中提取一个文件。我试图想出一种聪明的方法来将文件提取到同一目录中,也许在提取后将提取的文件命名为唯一的名称。但是,我是一名新手 Python 程序员,目前没有完成此类任务的技术知识或智能工具集。任何帮助表示赞赏。就目前而言,每次我想提取文件时都必须选择不同的输出目录。

 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('/')])

 userpath = "Extracted"
 directory = os.path.join("c:\\", userpath)
 try:
    for root, dirname, files in os.walk(directory):
        for file1 in files:
            if file1.endswith(".tgz") or file1.endswith(".tar"):
                extract(os.path.join(root, file1))
                print 'Done!'
 except:
    name = os.path.basename(sys.argv[0])
    print name[:name.rfind('.')], '<filename>'

【问题讨论】:

    标签: python path extract


    【解决方案1】:

    为什么不维护一个全局计数器,并在每次提取文件时将其附加到 extract() 方法中的“extract_path”?提取后(在 extract() 方法结束时)递增计数器。

    import os, sys, tarfile
    
    global counter
    counter=1
    
    def extract(tar_url, extract_path='.'):
         global counter
         print tar_url
         tar = tarfile.open(tar_url, 'r')
         for item in tar:
             tar.extract(item, extract_path+"_%d"%counter)
             counter+=1
             if item.name.find(".tgz") != -1 or item.name.find(".tar") != -1:
                 extract(item.name, "./" + item.name[:item.name.rfind('/')])
    

    【讨论】:

    • 好主意,它确实创建了编号目录....但是,这些文件现在只提取一个文件夹(它们没有完全提取)。
    【解决方案2】:

    如果不必将它们全部提取到同一目录中,您可以添加os.chdir 将您的工作目录更改为 tar 所在的位置。 dirname 在上面的脚本中。

    否则,您可以将每个 tar 提取到一个 tmp 目录,一旦提取完成,重命名该目录以匹配您提取的文件的名称。

    【讨论】:

    • 谢谢,但我已经做到了。我真的很想将它们放在同一个文件夹中。
    • @user tar 文件中有目录吗?
    【解决方案3】:

    我目前无法对此进行测试,但您是否可以简单地测试一下是否存在带有项目名称的文件夹,如果存在则继续(基本上是这样)

    def extract(tar_url, extract_path='.'):
         print tar_url
         tar = tarfile.open(tar_url, 'r')
         for item in tar:
             if(os.path.isdir(os.path.join(extract_path,item.name))):
                 continue;
             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('/')])
    

    【讨论】:

    • 嗨 C,它只是提取了一个名为 storage 的文件,并在我尝试在同一目录中提取另一个 .tgz 文件时覆盖该文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 2016-02-03
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    相关资源
    最近更新 更多