我想在一个目录中提取所有.tgz和.tar文件

时间:2011-06-10 18:51:40

标签: python path extract

我正在使用以下代码将.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>'

3 个答案:

答案 0 :(得分: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('/')])

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我目前无法对此进行测试,但您是否可以直接测试是否存在包含该项目名称的文件夹,然后继续(如果是这样)(基本上就是这样)

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