2016-04-25 16 views
1

Hier auszuschließen ist, was ich habe:Gibt es eine Möglichkeit bestimmte Dateitypen aus einem Verzeichnis Vergleich mit 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) 

Dies funktioniert genau nach Bedarf. Ich möchte in der Lage sein, * .lock-Dateien von den Ergebnissen zu filtern oder auszuschließen. Ich habe eine Ignorierfunktion im Zusammenhang mit dircmp gesehen, konnte jedoch keine Ergebnisse zurückgeben. Ich bin ein sehr einfacher Benutzer von Python.

Antwort

1

dircomp ‚s ignore braucht nicht Klackse, nur Literale.

Es wäre nicht sein, dass schwer zu reparieren ersetzt filecmp._filter mit:

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 

dies tun, bevor Sie dircmp anrufen und dann dircmp(..., ignore=['*.lock']) funktionieren würde, wie erwartet.

Nicht getestet.

+0

Das hat funktioniert. Danke Dan D. –

+0

Technisch gesehen sieht 'ignore' nur' object .__ contains__'. Sie könnten einen benutzerdefinierten "Container" erstellen, in dem '__contains__' auf einen globalen oder regulären Ausdruck prüft. Ich denke, das wäre ein bisschen weniger hacky, als ein Implementierungsdetail zu überschreiben (aber immer noch hacky). – mgilson

0

Können Sie die Filterung nach der Tat tun?

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

Dies funktionierte auch. Danke mgilson. –