2015-08-06 10 views
5

Ich bin sehr neu in Python. Ich muss durch die Unterverzeichnisse eines bestimmten Verzeichnisses iterieren und alle Dateien zurückgeben, die eine bestimmte Zeichenfolge enthalten.Schleife durch Ordner in Python und für Dateien mit Strings

for root, dirs, files in os.walk(path): 
    for name in files: 
     if name.endswith((".sql")): 
      if 'gen_dts' in open(name).read(): 
       print name 

Das war das nächste, das ich bekam.

Die Syntaxfehler ich erhalte, ist

Traceback (most recent call last): 
    File "<pyshell#77>", line 4, in <module> 
    if 'gen_dts' in open(name).read(): 
IOError: [Errno 2] No such file or directory: 'dq_offer_desc_bad_pkey_vw.sql' 

Die 'dq_offer_desc_bad_pkey_vw.sql' Datei enthält keine 'gen_dts' drin.

Ich schätze die Hilfe im Voraus.

+1

Auf den ersten Blick sieht es so aus. Was ist das Ergebnis? – Will

+1

Der Fehler, den ich bekommen ist Traceback (jüngste Aufforderung zuletzt): File "", Linie 4, in wenn 'gen_dts' in open (name) .mehr(): IOError: [Errno 2] Datei oder Verzeichnis: 'dq_offer_desc_bad_pkey_vw.sql' – user3264602

+0

@ user3264602, sollten Sie Ihre Frage bearbeiten, um diesen Fehler einzuschließen; Es hilft viel bei der Beantwortung. Ich schreibe jetzt eine Antwort. – Cyphase

Antwort

8

Sie erhalten diesen Fehler, weil Sie versuchen, name zu öffnen, das ist nur die Datei Name, nicht es ist voller relativer Pfad. Was Sie tun müssen, ist open(os.path.join(root, name), 'r') (Ich habe den Modus hinzugefügt, da es eine gute Übung ist).

for root, dirs, files in os.walk(path): 
    for name in files: 
     if name.endswith('.sql'): 
      filepath = os.path.join(root, name) 
      if 'gen_dts' in open(filepath, 'r').read(): 
       print filepath 

os.walk() gibt einen Generator, der Sie Tupel wie (root, dirs, files) gibt, wo root das aktuelle Verzeichnis, und dirs und files sind die Namen der Verzeichnisse und Dateien, die jeweils die im Root-Verzeichnis sind. Beachten Sie, dass es sich um die Namen, nicht die Pfade handelt; oder um genau zu sein, sie sind der Pfad dieses Verzeichnisses/der Datei relativ zum aktuellen Wurzelverzeichnis, was eine andere Art ist, dasselbe zu sagen. Eine andere Möglichkeit, um daran zu denken, ist, dass die Verzeichnisse und Dateien in dirs und files nie Schrägstriche in ihnen haben werden.

Ein letzter Punkt; Die Stammverzeichnispfade beginnen immer mit dem Pfad, den Sie an os.walk() übergeben, unabhängig davon, ob es sich um Ihr aktuelles Arbeitsverzeichnis handelt oder nicht. Für os.walk('three') wird root im ersten Tupel also 'three' sein (für os.walk('three/') wird es 'three/' sein). Für os.walk('../two/three') wird es '../two/three' sein. Für os.walk('/one/two/three/') ist es '/one/two/three/'; der zweite könnte '/one/two/three/four' sein.

+1

Diese Antwort hat bei mir funktioniert. Vielen Dank. – user3264602

0

Die Dateien sind nur die Dateinamen. Sie müssen den Pfad vor dem Öffnen hinzufügen. Verwenden Sie os.path.join.

Verwandte Themen