2016-04-22 19 views
6

Ich versuche, einen Code zum Umschreiben einer bestimmten Zeile aus einer TXT-Datei zu machen. Ich kann schreiben in der Zeile, die ich will, aber ich kann den vorherigen Text in der Zeile nicht löschen.Wie lösche Zeile aus Textdatei in Python?

Hier ist mein Code:
(Ich bin ein paar Dinge zu versuchen)

def writeline(file,n_line, text): 
    f=open(file,'r+') 
    count=0 
    for line in f: 
     count=count+1 
     if count==n_line : 
      f.write(line.replace(str(line),text)) 
      #f.write('\r'+text) 

Sie diesen Code verwenden, um eine Testdatei für die Prüfung zu machen:

with open('writetest.txt','w') as f: 
    f.write('1 \n2 \n3 \n4 \n5') 

writeline('writetest.txt',4,'This is the fourth line') 

Edit: Aus irgendeinem Grund, wenn ich 'if count == 5:' verwende, kompiliert der Code ok (auch wenn er den vorherigen Text nicht löscht), aber wenn ich 'if count == n_line:' mache, endet die Datei mit viel Müll.

Die Antworten funktionieren, aber ich möchte wissen, was die Probleme mit meinem Code sind, und warum ich nicht lesen und schreiben kann. Vielen Dank!

Antwort

9

Sie lesen aus der Datei und schreiben auch darauf. Tu das nicht. Stattdessen sollten Sie eine NamedTemporaryFile und dann rename über die Originaldatei schreiben, nachdem Sie mit dem Schreiben fertig sind und es schließen.

Oder wenn die Größe der Datei klein sein, ist garantiert, können Sie readlines() verwenden, um alle davon zu lesen, dann schließen Sie die Datei, ändern Sie die Zeile, die Sie wollen, und schreiben Sie es wieder heraus:

def editline(file,n_line,text): 
    with open(file) as infile: 
     lines = infile.readlines() 
    lines[n_line] = text+' \n' 
    with open(file, 'w') as outfile: 
     outfile.writelines(lines) 
2

Temporäre Datei verwenden:

import os 
import shutil 


def writeline(filename, n_line, text): 
    tmp_filename = filename + ".tmp" 

    count = 0 
    with open(tmp_filename, 'wt') as tmp: 
     with open(filename, 'rt') as src: 
      for line in src: 
       count += 1 
       if count == n_line: 
        line = line.replace(str(line), text + '\n') 
       tmp.write(line) 
    shutil.copy(tmp_filename, filename) 
    os.remove(tmp_filename) 


def create_test(fname): 
    with open(fname,'w') as f: 
     f.write('1 \n2 \n3 \n4 \n5') 

if __name__ == "__main__": 
    create_test('writetest.txt') 
    writeline('writetest.txt', 4, 'This is the fourth line') 
Verwandte Themen