2016-04-22 108 views
6

Sto provando a creare un codice per riscrivere una linea specifica da un file .txt. Posso arrivare a scrivere nella riga che voglio, ma non riesco a cancellare il testo precedente sulla linea.Come cancellare la riga dal file di testo in Python?

Ecco il mio codice:
(sto provando un paio di cose)

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) 

È possibile utilizzare questo codice per rendere un file di prova per il test:

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

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

Edit: Per qualche ragione, se uso 'if count == 5:' il codice compila ok (anche se non cancella il testo precedente), ma se lo faccio 'if count == n_line:', il file finisce con un sacco di spazzatura.

Le risposte funzionano, ma mi piacerebbe sapere quali sono i problemi con il mio codice e perché non riesco a leggere e scrivere. Grazie!

risposta

9

Stai leggendo dal file e anche scrivendo su di esso. Non farlo. Invece, dovresti scrivere su NamedTemporaryFile e poi su rename sul file originale dopo aver finito di scrivere e chiuderlo.

O se la dimensione del file è garantito per essere piccolo, è possibile utilizzare readlines() per leggere tutto questo, quindi chiudere il file, modificare la riga che si desidera, e scrivere di nuovo fuori:

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

Usa file temporaneo:

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') 
Problemi correlati