Cómo buscar y reemplazar texto en un archivo
¿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("> ")
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:
hi this is abcd hi this is abcd
This is dummy text file.
This is how search and replace works abcd
Cuando busco y reemplazo 'ram' por 'abcd' en el archivo de entrada anterior, funciona de maravilla. Pero cuando lo hago al revés, es decir, reemplazando 'abcd' por 'ram', quedan algunos caracteres basura al final.
Reemplazando 'abcd' por 'ram':
hi this is ram hi this is ram
This is dummy text file.
This is how search and replace works rambcd
Como señaló michaelb958 , no puede reemplazarlos con datos de diferente longitud porque esto colocará el resto de las secciones fuera de lugar. No estoy de acuerdo con los otros carteles que sugieren leer de un archivo y escribir en otro. En lugar de eso, leería el archivo en la memoria, arreglaría los datos y luego los escribiría en el mismo archivo en un paso separado.
# Read in the file
with open('file.txt', 'r') as file:
filedata = file.read()
# Replace the target string
filedata = filedata.replace('abcd', 'ram')
# Write the file out again
with open('file.txt', 'w') as file:
file.write(filedata)
A menos que tenga un archivo enorme con el que trabajar y que sea demasiado grande para cargarlo en la memoria de una sola vez, o le preocupe la posible pérdida de datos si el proceso se interrumpe durante el segundo paso en el que escribe datos en el archivo.
fileinput
ya admite la edición in situ. Redirige 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='')