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.

  • Wie finde ich heraus, ob eine Datei am `eof` ist?
  • Textdatei Lesen und Drucken von Daten
  • Python-Download-Dateien durch Links in csv gespeichert
  • Wie kann ich die ausgewählten Dateien aus dem Dialogfenster zu einem Wörterbuch hinzufügen?
  • Wie zwei fusionieren mehrere .csv Dateien horizontal mit Python?
  • Effizientes Lesen von 800 GB XML-Datei in Python 2.7
  • 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?

    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.