Cómo buscar y reemplazar texto en un archivo

Resuelto Shriram asked hace 11 años • 22 respuestas

¿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
Shriram avatar Jun 17 '13 12:06 Shriram
Aceptado

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.

Jack Aidley avatar Jun 17 '2013 06:06 Jack Aidley

fileinputya admite la edición in situ. Redirige stdoutal 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='')
jfs avatar Dec 15 '2013 10:12 jfs