Reemplazar cadena dentro del contenido del archivo

Respuestas:

181
with open("Stud.txt", "rt") as fin:
    with open("out.txt", "wt") as fout:
        for line in fin:
            fout.write(line.replace('A', 'Orange'))
Gareth Davidson
fuente
8
"t" para el modo de texto es solo Python 3. Además, proporciona un administrador de contexto para su archivo de salida, pero no cierra su archivo de entrada, lo que parece inconsistente.
Steven Rumbalski
1
@katrielalex: No hay votos negativos, simplemente no voté a favor. Pero dar respuestas a la tarea no
BlueRaja - Danny Pflughoeft
Uh, no noté que esto estaba etiquetado con "tarea". No eliminaré mi respuesta, pero tendré más cuidado en el futuro
Gareth Davidson
21
"dar respuestas a problemas con las tareas" es un comentario extremadamente estúpido. Si alguien quiere ayuda, ayúdelo. No todos buscan hacer su HW, algunos realmente quieren aprender algo ...
KingMak
5
Necesitaba esto para la tarea y me ayudó enormemente
mikeybeck
78

Si desea reemplazar las cadenas en el mismo archivo, probablemente deba leer su contenido en una variable local, cerrarlo y volver a abrirlo para escribir:

Estoy usando la declaración with en este ejemplo, que cierra el archivo después de withque se termina el bloque, ya sea normalmente cuando el último comando termina de ejecutarse o por una excepción.

def inplace_change(filename, old_string, new_string):
    # Safely read the input filename using 'with'
    with open(filename) as f:
        s = f.read()
        if old_string not in s:
            print('"{old_string}" not found in {filename}.'.format(**locals()))
            return

    # Safely write the changed content, if found in the file
    with open(filename, 'w') as f:
        print('Changing "{old_string}" to "{new_string}" in {filename}'.format(**locals()))
        s = s.replace(old_string, new_string)
        f.write(s)

Vale la pena mencionar que si los nombres de archivo fueran diferentes, podríamos haberlo hecho de manera más elegante con una sola withdeclaración.

Adam Matan
fuente
Esta solución es mejor porque no cambia el nombre del archivo a diferencia de la respuesta anterior.
47
#!/usr/bin/python

with open(FileName) as f:
    newText=f.read().replace('A', 'Orange')

with open(FileName, "w") as f:
    f.write(newText)
Mark Kahn
fuente
1
Breve y concisa, la mejor respuesta OMI
Briford Wylie
11

Algo como

file = open('Stud.txt')
contents = file.read()
replaced_contents = contents.replace('A', 'Orange')

<do stuff with the result>
TartánLlama
fuente
OP mencionó "cualquier ocurrencia", esto significa, incluso cuando es una subcadena, lo que no funcionará para su ejemplo.
Durdu
7
with open('Stud.txt','r') as f:
    newlines = []
    for line in f.readlines():
        newlines.append(line.replace('A', 'Orange'))
with open('Stud.txt', 'w') as f:
    for line in newlines:
        f.write(line)
Falmarri
fuente
6

Si está en Linux y solo desea reemplazar la palabra dogcon cat, puede hacer:

text.txt:

Hi, i am a dog and dog's are awesome, i love dogs! dog dog dogs!

Comando de Linux:

sed -i 's/dog/cat/g' test.txt

Salida:

Hi, i am a cat and cat's are awesome, i love cats! cat cat cats!

Publicación original: /ubuntu/20414/find-and-replace-text-within-a-file-using-commands

usuario1767754
fuente
2

Usando pathlib ( https://docs.python.org/3/library/pathlib.html )

from pathlib import Path
file = Path('Stud.txt')
file.write_text(file.read_text().replace('A', 'Orange'))

Si los archivos de entrada y salida fueran diferentes, usaría dos variables diferentes para read_texty write_text.

Si desea un cambio más complejo que un solo reemplazo, debe asignar el resultado de read_texta una variable, procesarlo y guardar el nuevo contenido en otra variable, y luego guardar el nuevo contenido con write_text.

Si su archivo era grande, preferiría un enfoque que no lea todo el archivo en la memoria, sino que lo procese línea por línea como lo muestra Gareth Davidson en otra respuesta ( https://stackoverflow.com/a/4128192/3981273 ) , que por supuesto requiere el uso de dos archivos distintos para entrada y salida.

Jorge Moraleda
fuente
write_text no funciona para mí. No está actualizando el archivo
Anurag
0

La forma más fácil es hacerlo con expresiones regulares, asumiendo que desea iterar sobre cada línea en el archivo (donde se almacenaría 'A') lo hace ...

import re

input = file('C:\full_path\Stud.txt), 'r')
#when you try and write to a file with write permissions, it clears the file and writes only #what you tell it to the file.  So we have to save the file first.

saved_input
for eachLine in input:
    saved_input.append(eachLine)

#now we change entries with 'A' to 'Orange'
for i in range(0, len(old):
    search = re.sub('A', 'Orange', saved_input[i])
    if search is not None:
        saved_input[i] = search
#now we open the file in write mode (clearing it) and writing saved_input back to it
input = file('C:\full_path\Stud.txt), 'w')
for each in saved_input:
    input.write(each)
Austinbv
fuente