2016-04-25 148 views
1

這裏排除從一個目錄比較特定的文件類型是什麼,我有:有沒有辦法使用python

import filecmp 
from filecmp import dircmp 
def print_right_only(dcmp): 
    for name in dcmp.right_only: 
     print "%s not found in %s but found in %s" % (name, dcmp.left, 
      dcmp.right) 
    for sub_dcmp in dcmp.subdirs.values(): 
     print_right_only(sub_dcmp) 

dcmp = dircmp('E:\GIS', 'J:\GIS') 
print_right_only(dcmp) 

這個工程完全按照需要的。我希望能夠從結果中篩選或排除* .lock文件。我看到一個與dircmp相關的忽略函數,但無法返回任何結果。我是python的一個非常基本的用戶。

回答

1

dircompignore不採取水珠,只有文字。

它不會是很難通過更換filecmp._filter修復:

from fnmatch import fnmatch 
def _filter(flist, skip): 
    return [item for item in flist 
       if not any(fnmatch(item, pat) for pat in skip)] 
filecmp._filter = _filter 

做到這一點,你叫dircmp,然後按預期dircmp(..., ignore=['*.lock'])會工作之前。

未經測試。

+0

工作。感謝Dan D. –

+0

從技術上講,'ignore'只查看'object .__ contains__'。您可以創建一個自定義「容器」,其中'__contains__'根據glob或正則表達式進行檢查。我認爲這會比覆蓋一個實現細節(但仍然很詭異)少一些。 – mgilson

0

你可以在事後做過濾嗎?

import filecmp 
from filecmp import dircmp 
def print_right_only(dcmp): 
    for name in dcmp.right_only: 

     if name.endswith('.lock'): # Check if it is a lock file. 
      continue 

     print "%s not found in %s but found in %s" % (name, dcmp.left, 
      dcmp.right) 
    for sub_dcmp in dcmp.subdirs.values(): 
     print_right_only(sub_dcmp) 

dcmp = dircmp('E:\GIS', 'J:\GIS') 
print_right_only(dcmp) 
+0

這也適用。感謝mgilson。 –