Ich muss die Unterverzeichnisse eines bestimmten Verzeichnisses durchlaufen und nach Dateien suchen. Wenn ich eine Datei erhalte, muss ich sie öffnen, den Inhalt ändern und durch meine eigenen Zeilen ersetzen.
Ich habe es versucht:
import os
rootdir ='C:/Users/sid/Desktop/test'
for subdir, dirs, files in os.walk(rootdir):
for file in files:
f=open(file,'r')
lines=f.readlines()
f.close()
f=open(file,'w')
for line in lines:
newline = "No you are not"
f.write(newline)
f.close()
aber ich bekomme einen Fehler. Was mache ich falsch?
Antworten:
Der eigentliche Spaziergang durch die Verzeichnisse funktioniert so, wie Sie ihn codiert haben. Wenn Sie den Inhalt der inneren Schleife durch eine einfache
print
Anweisung ersetzen , können Sie sehen, dass jede Datei gefunden wird:Wenn beim Ausführen der oben genannten Schritte weiterhin Fehler auftreten, geben Sie bitte die Fehlermeldung ein.
Aktualisiert für Python3
quelle
Eine andere Möglichkeit, alle Dateien in Unterverzeichnissen zurückzugeben, ist die Verwendung des
pathlib
in Python 3.4 eingeführten Moduls , das einen objektorientierten Ansatz für die Behandlung von Dateisystempfaden bietet (Pathlib ist auch in Python 2.7 über das Modul pathlib2 in PyPi verfügbar ):Seit Python 3.5 unterstützt das
glob
Modul auch die rekursive Dateisuche:Die
file_list
beiden oben genannten Ansätze können wiederholt werden, ohne dass eine verschachtelte Schleife erforderlich ist:quelle
pathlib
mich lieber selbst, vor allem, weil mir die objektorientierte Methodensyntax gefällt. Es gibt andere Unterschiede, z. B. dass die Pfadbibliothek bestimmte Pfadklassen anstelle von Zeichenfolgen zurückgibt und die verfügbaren Funktionen zwischen den Bibliotheken unterschiedlich sind (z . B.os.path.expanduser('~')
vsPath.home()
). Durchsuchen Sie die Dokumentation und finden Sie heraus, welchen Ansatz Sie bevorzugen.**
das Glob-Muster hinzuzufügen , können Sie es verwendenrglob
.Ab 2020 ,
glob.iglob(path/**, recursive=True)
scheint die pythonic Lösung, das heißt:Ausgabe:
Anmerkungen:
1 - glob.iglob
2 - Wenn rekursiv ist
True
, stimmt das Muster'**'
mit allen Dateien und null oder mehrdirectories
und übereinsubdirectories
.3 - Wenn das Verzeichnis Dateien enthält, die mit beginnen, werden
.
diese standardmäßig nicht abgeglichen. Betrachten Sie beispielsweise ein Verzeichnis mitcard.gif
und.card.gif
:4 - Sie können auch verwenden
rglob(pattern)
, was dem Aufrufenglob()
mit**/
dem vor dem angegebenen relativen Muster hinzugefügten entspricht.quelle