Schreiben nach dem Lesen aus der Datei in die gleiche Datei

Mein Ziel ist es, Zeile aus der Datei zu lesen, die Leerzeichen am Ende zu decken und in dieselbe Datei zurückzuschreiben. Ich habe den folgenden Code ausprobiert:

with open(filename, 'r+') as f: for i in f: f.write(i.rstrip()+"\n") 

Dies scheint am Ende der Datei zu schreiben, wobei die Anfangsdaten in der Datei intakt gehalten werden. Ich weiß, dass mit f.seek(0) würde der Zeiger zurück zum Anfang der Datei, die ich f.seek(0) , wäre irgendwie für diese Lösung erforderlich.

Können Sie bitte beraten, wenn es einen anderen Ansatz für diese oder bin ich auf dem richtigen Patch müssen nur noch mehr Logik in den Code hinzufügen?

  • Regulärer Ausdruck, der mit der Komma-getrennten Liste von key = value übereinstimmt, wobei der Wert Kommas enthalten kann
  • Tut, mit offen () funktioniert nicht mit python 2.6
  • Warum kann nicht python ein zip-Archiv ausführen, das über stdin weitergegeben wird?
  • Wie bekomme ich Python isidentifer () Funktionalität in Python 2.6?
  • Urllib2 läuft gut, wenn ich das Programm unabhängig laufe, aber wirft Fehler, wenn ich es zu einem Cronjob hinzufügen
  • Entfernen von vollständig isolierten Zellen aus Python-Array?
  • Kann nicht älteren wxPython in virtualenv installieren (kann die Datei nicht entpacken / kann das Archivformat nicht ermitteln)
  • Kann nicht pythonmodul "pycrypto" auf Debian lenny installieren
  • 2 Solutions collect form web for “Schreiben nach dem Lesen aus der Datei in die gleiche Datei”

    Verwenden Sie eine temporäre Datei. Python bietet die Möglichkeit, temporäre Dateien sicher zu erstellen. Rufen Sie das Beispiel unten mit: python modify.py target_filename

      import tempfile import sys def modify_file(filename): #Create temporary file read/write t = tempfile.NamedTemporaryFile(mode="r+") #Open input file read-only i = open(filename, 'r') #Copy input file to temporary file, modifying as we go for line in i: t.write(line.rstrip()+"\n") i.close() #Close input file t.seek(0) #Rewind temporary file to beginning o = open(filename, "w") #Reopen input file writable #Overwriting original file with temporary file contents for line in t: o.write(line) t.close() #Close temporary file, will cause it to be deleted if __name__ == "__main__": modify_file(sys.argv[1]) 

    Referenzen hier: http://docs.python.org/2/library/tempfile.html

    Das Problem mit deinem Ansatz ist, dass du sowohl einen Eingabestream als auch einen Ausgabestream benötigst, der an verschiedenen Stellen in derselben Datei zeigen kann. Wenn du f.seek() benutzen f.seek() dann musst du die Position nach f.tell() nach jedem Lesen und Schreiben speichern. Beispielsweise:

     f = open(filename, 'r+') while True: i = f.readline() if i == '': break in = f.tell() f.seek(out) f.write(i.rstrip()+"\n") out = f.tell() f.seek(in) 

    Aber das ist verwirrend und anfällig für Fehler. Wenn die Datei nicht zu groß ist, warum lese sie nicht alles in Erinnerung und schreibe dann wieder zurück?

     in = open(filename, 'r') lines = in.read() in.close() out = open(filename, 'w') out.write([line.rstrip()+'\n' for line in lines.split('\n')]) out.close() 

    Wenn die Datei zu groß ist, um in den Speicher zu passen, dann schreiben Sie die Zeilen in eine temporäre Datei und benennen Sie dann die Datei um, wenn Sie fertig sind:

     out = open(filename+'.tmp', 'w') with open(filename, 'r') as f: for i in f: out.write(i.rstrip()+"\n") out.close() os.rename(filename+'.tmp', filename) 
    Python ist die beste Programmiersprache der Welt.