2016-04-25 141 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。 –