2017-04-14 62 views
2

我寫它使用tar文件模塊備份腳本中使用的過濾器。我是一名Python初學者。這裏是我的腳本的一部分 - 所以我的需要在tar.gz.要存檔的路徑列表看到這個post,我想出了以下內容。現在存檔被創建,但擴展名爲.tmp和.data的文件不會被忽略。我正在使用python 3.5的Python:在tar文件

L = [path1, path2, path3, path4, path5] 
exclude_files = [".tmp", ".data"] 
# print L 

def filter_function(tarinfo): 
    if tarinfo.name in exclude_files: 
      return None 
    else: 
      return tarinfo 

with tarfile.open("backup.tar.gz", "w:gz") as tar: 
    for name in L: 
     tar.add(name, filter=filter_function) 

回答

1

您正在比較擴展名和全名。

只需使用os.path.splitext和比較擴展:

if os.path.splitext(tarinfo.name)[1] in exclude_files: 

短:重寫add符合三元表達式和lambda來避免輔助功能:

tar.add(name, filter=lambda tarinfo: None if os.path.splitext(tarinfo.name)[1] in exclude_files else tarinfo) 
+0

謝謝。那工作。我有一個問題,如果我必須添加排除列表的路徑,那將如何工作? – akya

+0

那將是一個相對路徑。你可以執行一個'os.path.dirname(tarinfo.name)'並與你想排除的目錄進行比較。我建議你打印你在功能上比較的兩個部分,以便看看它們是否有可能匹配。如果您首先做到了這一點,那麼您會看到您將擴展名與全名進行比較。 –

+0

我寫了這個代替 'L = [path1,path2,path3,path4,path5] exclude_files = [「.tmp」,「.data」,「/ media/Data/Textfiles/Linux」,「/ media /數據/ TEXTFILES /老/ Pushbullet「] 高清exclude_function(文件名): 如果exclude_files或os.path.splitext(文件名)的文件名[1] exclude_files: 返回True 其他: 返回False 與tarfile.open( 「backup.tar.gz」, 「W:GZ」)作爲焦油 爲了實現L名稱: tar.add(姓名,排除= exclude_function)' – akya