2010-06-02 7 views
5

¿Cómo puedo reemplazar una cadena con otra cadena dentro de un archivo de texto dado? ¿Simplemente recorro readline() y ejecuto el reemplazo mientras guardo en un nuevo archivo? ¿O hay un mejor camino?¿Reemplazo de cadena en un archivo de texto completo en Python 3.x?

estoy pensando que podría leerlo completo en la memoria, pero estoy buscando una solución más elegante ...

Gracias de antemano

+0

¿Hay algún motivo en particular por el que no desee recorrer las líneas? Probablemente sea la mejor solución. – cobbal

+0

No lo sé ... Me preguntaba si había una mejor manera, supongo. En lugar de crear un nuevo archivo y eliminar el anterior. –

+0

al crear el nuevo archivo, elimina la necesidad de tener todo el archivo en la memoria ... y si está haciendo un re.sub, debe asegurarse de utilizar primero re.compile (y luego use el submétodo de la instancia devuelta) –

Respuesta

10

fileinput es el módulo de la biblioteca estándar de Python que admite "lo que parece una actualización in situ de archivos de texto", así como otras tareas relacionadas.

for line in fileinput.input(['thefile.txt'], inplace=True): 
    print(line.replace('old stuff', 'shiny new stuff'), end='') 

Este código es todo lo necesario para la tarea específica que usted ha mencionado - se ocupa de todos los temas (al grabar en un archivo diferente, retirar el usado cuando se hace y su sustitución por uno nuevo) También puede agregar un parámetro adicional como backup='.bk' para conservar automáticamente el archivo anterior como (en este caso) thefile.txt.bk, así como procesar varios archivos, tomar los nombres de archivo para procesar desde la línea de comandos, etc., etc. - lea los documentos, son bastante buenos (¡y también lo es el módulo que sugiero!).

+2

Evite usar "imprimir" y use "sys.stdout.write" en su lugar si no desea "imprimir" para agregar línea en blanco y CTRL-M después de cada línea – Badisi

+0

@Badisi Puede lograr eso configurando 'print' s parámetro 'end', que por defecto está configurado en' \ n', en una cadena vacía. Es decir: 'print (line, end = '')'. Ver https://docs.python.org/3.3/library/functions.html#print –

4

Si el archivo se puede leer en la memoria a la vez, yo diría que

old = myfile.read() 
new = old.replace("find this", "replace by this") 
output.write(new) 

es al menos tan legible como

for line in myfile: 
    output.write(line.replace("find this", "replace by this")) 

y podría ser un poco más rápido, pero al final probablemente no importe.

Cuestiones relacionadas