Derzeit verwende ich Folgendes:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()
Das Problem ist jedoch, dass die alte Datei größer als die neue Datei ist. Am Ende habe ich eine neue Datei, die am Ende einen Teil der alten Datei enthält.
f.write(text)
nachf.truncate()
?f.write(text)
stehtf.truncate()
in diesem Code vor; es schreibt dentext
ersten, also nachdem.write()
der Dateicursor am Ende von positioniert isttext
. Wenn Sie mit dem Abschneiden der Datei fortfahren, werden alle verbleibenden Bytes entfernt, die die Datei nach diesem Zeitpunkt möglicherweise hat. In diesem Fall ist das Endergebnis dasselbe, als ob Sie es vor dem Schreiben abgeschnitten hätten.fileinput
Modul zur bevorzugten Methode werden. Nach der Übergabeinplace=1
wird die Datei zuerst an einen temporären Speicherort verschoben und dann eine neue Datei in den alten Dateinamenpfad geschrieben. Dieser Verschiebungsvorgang ist auf Unix-Dateisystemen schnell, da nur das Dateisystem verschoben wirdinode
und nicht der gesamte Inhalt . Anschließend können Sie jede Zeile einzeln lesen und verarbeiten, um ein Aufblähen des Speichers zu vermeiden. :-)Wahrscheinlich wäre es einfacher und übersichtlicher, die Datei danach zu schließen
text = re.sub('foobar', 'bar', text)
, sie zum Schreiben erneut zu öffnen (wodurch alte Inhalte gelöscht werden ) und Ihren aktualisierten Text darauf zu schreiben.quelle
Das
fileinput
Modul verfügt über eineninline
Modus zum Schreiben von Änderungen an der Datei, die Sie verarbeiten, ohne temporäre Dateien usw. zu verwenden. Zeilennummer usw., wenn Sie sie innerhalb der Schleife überprüfen möchten.quelle
Ehrlich gesagt können Sie sich diese Klasse ansehen, die ich erstellt habe und die grundlegende Dateioperationen ausführt. Die Schreibmethode überschreibt und hängt alte Daten.
quelle
Versuchen Sie es in eine neue Datei zu schreiben.
quelle