¿Cómo buscar y reemplazar texto en un archivo usando Python?

¿Cómo busco y reemplazo texto en un archivo usando Python 3?

Aquí está mi código:

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...' ) 

Fichero de entrada:

hola esto es abcd hola esto es abcd

Este es un archivo de texto ficticio.

Así es como funciona la búsqueda y el reemplazo abcd

Cuando busco y reemplazo ‘ram’ por ‘abcd’ en el archivo de entrada anterior, funciona como un amuleto. Pero cuando lo hago viceversa, es decir, reemplazando ‘abcd’ por ‘ram’, algunos caracteres basura quedan al final.

Reemplazando ‘abcd’ por ‘ram’

hola esto es ram hi esto es ram

Este es un archivo de texto ficticio.

Así es como la búsqueda y el reemplazo funcionan

fileinput ya admite la edición in situ. Redirecciona stdout al archivo en este caso:

 #!/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='') 

Como señaló michaelb958, no puede reemplazar en su lugar con datos de una longitud diferente porque esto colocará el rest de las secciones fuera de lugar. No estoy de acuerdo con los otros carteles que sugieren que lea de un archivo y escriba a otro. En cambio, leería el archivo en la memoria, arreglaría los datos y luego lo escribiría en el mismo archivo en un paso por separado.

 # 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 menos que tenga un archivo masivo para trabajar que es demasiado grande para cargar en la memoria de una vez.

Como Jack Aidley había publicado y JF Sebastian señaló, este código no funcionará:

  # 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)` 

Pero este código FUNCIONARÁ (lo he probado):

 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 este método, filein y fileout pueden ser el mismo archivo, porque Python 3.3 sobreescribirá el archivo al abrirlo para escritura.

Puedes hacer el reemplazo como este

 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() 

Su problema proviene de leer y escribir en el mismo archivo. En lugar de abrir fileToSearch para escribir, abra un archivo temporal real y luego, una vez que haya terminado y haya cerrado tempFile , use os.rename para mover el nuevo archivo a través de fileToSearch .

Mi variante, palabra por palabra en todo el archivo.

Lo leí en la 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) 

He hecho esto:

 #!/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 () 

Recomiendo que valga la pena echarle un vistazo a este pequeño progtwig. Las expresiones regulares son el camino a seguir.

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

Modifiqué ligeramente la publicación de Jayram Singh para reemplazar cada instancia de ‘!’ carácter a un número que quería incrementar con cada instancia. Pensé que podría ser útil para alguien que quería modificar un personaje que ocurrió más de una vez por línea y quería iterar. Espero que ayude a alguien. PD: soy muy nuevo en la encoding así que me disculpo si mi publicación es inapropiada de alguna manera, pero esto funcionó para mí.

 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 (buscar, reemplazar):

 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)