Ich Iterieren Verzeichnisse und Dateien in ihnen, während ich vor Ort jede Datei ändern. Ich suche nach der neuen modifizierten Datei, die gleich danach gelesen wird. Hier ist mein Code mit beschreibenden Kommentaren:Ändern einer Datei innerhalb von verschachtelten für Schleifen
# go through each directory based on their ids
for id in id_list:
id_dir = os.path.join(ouput_dir, id)
os.chdir(id_dir)
# go through all files (with a specific extension)
for filename in glob('*' + ext):
# modify the file by replacing all new-line characters with an empty space
with fileinput.FileInput(filename, inplace=True) as f:
for line in f:
print(line.replace('\n', ' '), end='')
# here I would like to read the NEW modified file
with open(filename) as newf:
content = newf.read()
Wie es aussieht, die newf
ist nicht das neue modifizierte ein, sondern die ursprüngliche f
. Ich denke, ich verstehe, warum das so ist, aber ich fand es schwierig, dieses Problem zu überwinden.
Ich kann immer 2 separate Iterationen (gehen Sie durch jedes Verzeichnis auf der Grundlage ihrer IDs, gehen Sie durch alle Dateien (mit einer spezifischen Erweiterung) und ändern Sie die Datei, und wiederholen Sie die Iteration, um jedes von ihnen zu lesen), aber ich war Ich hoffe, dass es einen effizienteren Weg gibt. Vielleicht, wenn es möglich wäre, die zweite for
Schleife neu zu starten, nachdem die Änderung stattgefunden hat und dann die read
stattfinden lassen (so zu vermeiden, mindestens die äußere for
Schleife zu wiederholen).
Irgendwelche Ideen/Designs, um die oben genannten auf eine saubere und effiziente Weise zu erreichen?
drucken Sie immer nur den ersetzten Wert, Sie ändern ihn nie. 'line.replace()' gibt eine neue Instanz einer Zeile zurück und würde das Original nicht überschreiben? – TheLazyScripter
@TheLazyScripter Ich korrigiere gerade einen kleinen Tippfehler. Außerdem funktioniert das Codebeispiel, das die Ersetzung durchführt, OK; Wenn ich es separat versuche, ändert es die Datei und speichert sie an Ort und Stelle. – Yannis
Haben Sie versucht, 'print (line.replace ('\ n', ''), end = '')' durch 'line = line.replace ('\ n', '') zu ersetzen? Drucken (Zeile); '? –