13 Stimmen

Datei öffnen, lesen, verarbeiten und zurückschreiben - die kürzeste Methode in Python

Ich möchte einige grundlegende Filterungen in einer Datei vornehmen. Lesen, verarbeiten, zurückschreiben.

Ich bin nicht auf der Suche nach "Golfspielen", sondern nach der einfachsten und elegantesten Methode, um dies zu erreichen. Ich habe mir das ausgedacht:

from __future__ import with_statement

filename = "..." # or sys.argv...

with open(filename) as f:
    new_txt = # ...some translation of f.read() 

open(filename, 'w').write(new_txt)

Le site with Anweisung macht die Sache kürzer, da ich die Datei nicht explizit öffnen und schließen muss.

Irgendwelche anderen Ideen?

26voto

Hortitude Punkte 13080

Eine einfachere Möglichkeit, fileinput zu verwenden, ist die Verwendung des Parameters inplace:

import fileinput
for line in fileinput.input (filenameToProcess, inplace=1):
    process (line)

Wenn Sie den inplace-Parameter verwenden, wird stdout in Ihre Datei umgeleitet, so dass bei einem Druckvorgang zurück in Ihre Datei geschrieben wird.

Dieses Beispiel fügt Ihrer Datei Zeilennummern hinzu:

import fileinput

for line in fileinput.input ("b.txt",inplace=1):
    print "%d: %s" % (fileinput.lineno(),line),

4voto

Robert Rossney Punkte 91100

Ich würde für Eleganz einen anderen Weg einschlagen: Implementieren Sie Ihre Dateilese- und Filteroperationen als Generatoren. Sie werden mehr Codezeilen schreiben, aber es wird flexibler, wartbarer und performanter Code sein.

Siehe David M. Beazleys Generator-Tricks für Systemprogrammierer was für jeden, der diese Art von Code schreibt, sehr wichtig ist.

3voto

Federico A. Ramponi Punkte 44697

Das scheint zu funktionieren:

with open(filename, "r+") as f:
    new_txt = process(f.read())
    f.truncate(0)
    f.write(new_txt)

2voto

user26294 Punkte 5105

Wenn Sie nach dem Pythonäquivalent von "perl -pi" suchen, finden Sie hier ein ziemlich gutes:

import fileinput
for line in fileinput.input():
   # process line

Voir http://www.python.org/doc/2.5.2/lib/module-fileinput.html für mehr.

Auf diese Weise würden Sie Ihr Python-Skript in einer Pipe verwenden, um die neue Datei zu erstellen:

$ myscript.py infile.txt > outfile.txt

1voto

Glyph Punkte 30137

Und zwar auf eine Art und Weise, die nicht Ihre Daten essen wenn Sie in der Mitte abstürzen:

from twisted.python.filepath import FilePath
p = FilePath(filename)
p.setContent(process(p.getContent()))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X