Reemplazar cadena dentro del contenido del archivo


97

¿Cómo puedo abrir un archivo, Stud.txt, y luego reemplazar cualquier aparición de "A" con "Orange"?


4
Por favor (como siempre) siga las pautas generales de preguntas , indique las restricciones especiales, muestre lo que ha intentado hasta ahora y pregunte qué es lo que específicamente lo confunde.

18
Por favor, también, marque su tarea con la etiqueta [tarea].
S.Lott

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

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.


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)

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>

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)


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.


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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.