Die Lösung von @iulian ist eine gute, aber wie er gewarnt hatte - es benötigt genügend Speicher, um die Daten zu halten. Wenn Sie große Dateien erwarten und akzeptieren können vorübergehend zusätzlichen Speicherplatz verwenden (anstelle von RAM), Sie in eine separate Ausgabedatei schreiben kann, verarbeiteten Daten schreiben, dann das Original mit ersetzen:
import shutil
import tempfile
with open("data.txt", "rU") as f_in:
f_out = tempfile.NamedTemporaryFile(delete=False)
for line in f_in:
if ";" in line:
line = "0;{}\n".format(line.split(";", 1)[0])
f_out.write(line)
f_out.close()
shutil.move(f_out.name, "data.txt")
Sie können‘ t Ersetzen Sie Daten vor Ort, wenn Sie nicht garantieren können, dass neue Zeilen nicht länger als alte Zeilen sind. Wenn dies geschieht, werden Sie sich selbst in einer Situation begegnen, in der Ihre Schreibposition weiter ist als eine, und die Datei wird beschädigt.
Wenn Sie jedoch sicher sein, dass keine neue Zeile länger sein wird als ein altes (zB gibt es definitiv keine "1234;"
Linien in Quelle, die "0;1234"
nach der Transformation werden würde), können Sie dies auch tun:
with open("data.txt", "rb+") as f:
write_offset = 0
for line in f.readlines():
line_len = new_len = len(line)
if ";" in line:
line = "0;{}\n".format(line.split(";", 1)[0])
new_len = len(line)
if new_len > line_len:
# Bad things had just happened.
raise RuntimeError("New line is longer than old one!"
" File is now corrupt.")
read_offset = f.tell() # Remember the current position
f.seek(write_offset) # Seek to where we should write to
f.write(line)
write_offset += new_len
f.seek(read_offset) # Return to where we were
# It could happen that new file is shorter.
f.seek(write_offset)
f.truncate()
Diese Version führt die Aktualisierungen direkt durch und benötigt keine zusätzlichen Speicher- oder Festplattenanforderungen.
(Beachten Sie, hat f.readlines()
einen Puffer, so f.tell()
Ergebnisse werden nicht einzelne Linienverschiebungen sein -. Für den Fall, würden Sie wollen, diejenigen aus irgendeinem Grunde verwenden wir für unsere Zwecke das hier ignorieren.)
Bitte die Traceback-Nachricht anzeigen. –
IndexError: Listenindex außerhalb des zulässigen Bereichs. Die Textdatei wird mit diesem http://imgur.com/xtddcJf – Johny
gefüllt. Bitte bearbeiten Sie Ihren Beitrag, um die gesamte Traceback-Nachricht einzuschließen, da ich sehr bezweifle, dass 'f.write (..)' einen IndexError auslösen wird. –