Skip to main content
 首页 » 编程设计

python之我想将所有 .tgz 和 .tar 文件提取到一个目录中

2025年05月04日8mayingbao

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

请您参考如下方法:

为什么不维护一个全局计数器,并在每次提取文件时将其附加到 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('/')])