2013-11-22 19 views
0

我有我需要添加到tar歸檔文件的目錄。的目錄結構是:使用Python將多個文件從多個目錄添加到獨特的.tar.gz文件中

..\root\path\dirname\somefiles.txt 

和含有somefiles.ext。tar.gz的文件應該被存入.. \根\路徑\爲:

..\root\path\dirname.tar.gz 

,我目前已經是該代碼:

import os, tarfile 

for root, dirs, files in os.walk('.'): 
    for dir in dirs: 
     tar = tarfile.open(dir + '.tar.gz', 'w:gz') 
     for file in files: 
      tar.add(os.path.join(root, file)) 
     tar.close() 

然而,這從..\root\path\而不是..\root\path\dirname\拉文件。我該如何編寫這個文件來將文件從每個目錄中提取出來,並將它們添加到同名目錄的存檔中?

編輯

隨着使用@ mVChr的代碼,我能得到我所需要的。我添加了arcname=f以刪除檔案中的目錄;我不知道爲什麼我之前沒有實現:

import os, tarfile 

for root, dirs, _ in os.walk('.'): 
    for d in dirs: 
     with tarfile.open(d + '.tar.gz', 'w:gz') as tar: 
      for _, _, files in os.walk(os.path.join(root, d)): 
       for f in files: 
        tar.add(os.path.join(root, d, f), arcname=f) 

回答

0

一對夫婦的事情...

可以,但你可能不應該使用dirfile作爲變量名,因爲那些已經在Python中的含義。

您應該將tarfile.open置於with語句中,這樣無論執行正常結束還是錯誤發生,您都可以確定它會執行close()

話雖這麼說,這稍加改動代碼完成你的任務:

import os, tarfile 

for root, dirs, _ in os.walk('.'): 
    for d in dirs: 
     with tarfile.open(d + '.tar.gz', 'w:gz') as tar: 
      for _, _, files in os.walk(os.path.join(root, d)): 
       for f in files: 
        tar.add(os.path.join(root, d, f)) 
+0

我明白你的觀點是指變量名稱。這也會在存檔中創建一個目錄:.. \ root \ path \ dirname.tar.gz \ dirname \ somefiles.ext另外你也省去了tar.close()。 – user2998182

+0

我沒有遺漏'tar.close()',這是我關於使用'with'的意思,它是爲你做的。 http://docs.python.org/2/reference/compound_stmts.html#the-with-statement和'inspect.getsource(tarfile.TarFile .__ exit __)' – mVChr

+0

啊,我明白了。我的錯。是否可以截斷流程中的目錄層次結構?我只想要這些文件,沒有文件夾... – user2998182

0

也許是這樣嗎?

#!/usr/local/cpython-3.3/bin/python 

import os 
import glob 
import tarfile 

def main(): 
    directories = [ dirname for dirname in glob.glob('*') if not dirname.endswith('.tar.gz') ] 

    for directory in directories: 
     print('working on {}'.format(directory)) 
     for root, dirs, filenames in os.walk(directory): 
      tar = tarfile.open('{}.tar.gz'.format(directory), 'w:gz') 
      for filename in filenames: 
       tar.add(os.path.join(root, filename)) 
      tar.close() 

main() 
+0

這存檔創建一個目錄.. \ ROOT \路徑\ dirname.tar.gz \目錄名\ somefiles.ext我尋找.. \ root \ path \ dirname.tar.gz \ somefiles.ext – user2998182

相關問題