Come cercare e sostituire il testo in un file usando Python?

Come posso cercare e sostituire il testo in un file usando Python 3?

Ecco il mio codice:

import os import sys import fileinput print ("Text to search for:") textToSearch = input( "> " ) print ("Text to replace it with:") textToReplace = input( "> " ) print ("File to perform Search-Replace on:") fileToSearch = input( "> " ) #fileToSearch = 'D:\dummy1.txt' tempFile = open( fileToSearch, 'r+' ) for line in fileinput.input( fileToSearch ): if textToSearch in line : print('Match Found') else: print('Match Not Found!!') tempFile.write( line.replace( textToSearch, textToReplace ) ) tempFile.close() input( '\n\n Press Enter to exit...' ) 

File di input:

ciao questo è abcd ciao questo è abcd

Questo è un file di testo fittizio.

Ecco come funziona la ricerca e la sostituzione

Quando cerco e sostituisco ‘ram’ con ‘abcd’ nel file di input sopra, funziona come un incantesimo. Ma quando lo faccio viceversa cioè sostituendo “abcd” con “ram”, alla fine vengono lasciati alcuni caratteri indesiderati.

Sostituire “abcd” con “ram”

ciao questo è ram ciao questo è ram

Questo è un file di testo fittizio.

Ecco come funziona la ricerca e la sostituzione

fileinput supporta già la modifica sul posto. In questo caso, reindirizza lo stdout al file:

 #!/usr/bin/env python3 import fileinput with fileinput.FileInput(filename, inplace=True, backup='.bak') as file: for line in file: print(line.replace(text_to_search, replacement_text), end='') 

Come sottolineato da michaelb958, non è ansible sostituire in posizione con dati di lunghezza diversa poiché ciò interromperà il resto delle sezioni. Non sono d’accordo con gli altri poster che suggeriscono di leggere da un file e scrivere su un altro. Invece, vorrei leggere il file in memoria, correggere i dati e poi scriverlo sullo stesso file in un passaggio separato.

 # Read in the file with open('file.txt', 'r') as file : filedata = file.read() # Replace the target string filedata = filedata.replace('ram', 'abcd') # Write the file out again with open('file.txt', 'w') as file: file.write(filedata) 

A meno che tu non abbia un file enorme con cui lavorare è troppo grande per essere caricato nella memoria in un colpo solo.

Come Jack Aidley ha pubblicato e JF Sebastian ha sottolineato, questo codice non funzionerà:

  # Read in the file filedata = None with file = open('file.txt', 'r') : filedata = file.read() # Replace the target string filedata.replace('ram', 'abcd') # Write the file out again with file = open('file.txt', 'w') : file.write(filedata)` 

Ma questo codice funzionerà (l’ho provato):

 f = open(filein,'r') filedata = f.read() f.close() newdata = filedata.replace("old data","new data") f = open(fileout,'w') f.write(newdata) f.close() 

Usando questo metodo, filein e fileout possono essere lo stesso file, perché Python 3.3 sovrascriverà il file all’apertura per la scrittura.

Puoi fare la sostituzione in questo modo

 f1 = open('file1.txt', 'r') f2 = open('file2.txt', 'w') for line in f1: f2.write(line.replace('old_text', 'new_text')) f1.close() f2.close() 

Il tuo problema deriva dalla lettura e dalla scrittura sullo stesso file. Anziché aprire fileToSearch per la scrittura, apri un file temporaneo effettivo e, una volta terminato e chiuso con tempFile , utilizza os.rename per spostare il nuovo file su fileToSearch .

La mia variante, una parola alla volta sull’intero file.

L’ho letto nella memoria.

 def replace_word(infile,old_word,new_word): if not os.path.isfile(infile): print ("Error on replace_word, not a regular file: "+infile) sys.exit(1) f1=open(infile,'r').read() f2=open(infile,'w') m=f1.replace(old_word,new_word) f2.write(m) 

Ho fatto questo:

 #!/usr/bin/env python3 import fileinput import os Dir = input ("Source directory: ") os.chdir(Dir) Filelist = os.listdir() print('File list: ',Filelist) NomeFile = input ("Insert file name: ") CarOr = input ("Text to search: ") CarNew = input ("New text: ") with fileinput.FileInput(NomeFile, inplace=True, backup='.bak') as file: for line in file: print(line.replace(CarOr, CarNew), end='') file.close () 

Raccomando che valga la pena di dare un’occhiata a questo piccolo programma. Le espressioni regolari sono la strada da percorrere.

https://github.com/khranjan/pythonprogramming/tree/master/findandreplace

Ho modificato leggermente il post di Jayram Singh per sostituire ogni istanza di un ‘!’ carattere a un numero che volevo incrementare con ogni istanza. Ho pensato che potesse essere utile a qualcuno che voleva modificare un personaggio che si è verificato più di una volta per riga e voleva iterare. Spero che aiuti qualcuno. PS- Sono molto nuovo nel programmare così scuse se il mio post non è appropriato in alcun modo, ma questo ha funzionato per me.

 f1 = open('file1.txt', 'r') f2 = open('file2.txt', 'w') n = 1 # if word=='!'replace w/ [n] & increment n; else append same word to # file2 for line in f1: for word in line: if word == '!': f2.write(word.replace('!', f'[{n}]')) n += 1 else: f2.write(word) f1.close() f2.close() 
 def word_replace(filename,old,new): c=0 with open(filename,'r+',encoding ='utf-8') as f: a=f.read() b=a.split() for i in range(0,len(b)): if b[i]==old: c=c+1 old=old.center(len(old)+2) new=new.center(len(new)+2) d=a.replace(old,new,c) f.truncate(0) f.seek(0) f.write(d) print('All words have been replaced!!!') 

def findReplace (trova, sostituisci):

 import os src = os.path.join(os.getcwd(), os.pardir) **`//To get the folder in which files are present`** for path, dirs, files in os.walk(os.path.abspath(src)): for name in files: if name.endswith('.py'): filepath = os.path.join(path, name) with open(filepath) as f: s = f.read() s = s.replace(find, replace) with open(filepath, "w") as f: f.write(s)