2011-06-10 81 views
2

我正在使用以下代碼將.tgz和.tar文件提取到歸檔文件所在的同一目錄中。它適用於單個文件。但是,當我選擇同一目錄中的另一個文件進行提取時,當前文件夾將被覆蓋(所有文件將提取一個名爲storage的根文件夾)。我想這就是文件被覆蓋的原因。所以,我一次只能在目錄中提取一個文件。我試圖想出一種巧妙的方法將文件提取到相同的目錄中,也許一旦提取文件就將提取的文件命名爲唯一。但是,我是一位新手Python程序員,目前還沒有技術訣竅或知識工具集來完成此類任務。任何幫助表示讚賞。就目前而言,每次我想要提取文件時,我都必須選擇不同的輸出目錄。我想提取所有.tgz和.tar文件在一個目錄中

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>' 

回答

0

如果他們沒有被提取都在同一個目錄中,你可以添加一個os.chdir改變你的工作目錄焦油駐留的位置。 dirname在你的腳本中。

否則,您可以將每個tar提取到tmp目錄,並且一旦提取完成,將dir重命名爲與您提取的文件的名稱相匹配。

+0

謝謝,但我已經做到了。我非常有興趣把他們放在同一個文件夾中。 – suffa 2011-06-10 19:50:24

+0

@user在tar文件中有目錄嗎? – tMC 2011-06-10 20:10:17

+0

是的,tar文件中有很多目錄。 – suffa 2011-06-10 22:37:52

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

好主意,它確實創建編號的目錄....但是,這些文件現在只提取一個文件夾(它們不會完全提取)。 – suffa 2011-06-10 19:56:17

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

嗨C,它只是提取一個名爲存儲的文件,並且當我試圖在同一目錄中提取另一個.tgz文件時覆蓋該文件。 – suffa 2011-06-12 04:41:37

相關問題