Substitua a string no conteúdo do arquivo


97

Como posso abrir um arquivo Stud.txt e, em seguida, substituir qualquer ocorrência de "A" por "Laranja"?


4
Siga (como sempre) as diretrizes gerais para perguntas , indique quaisquer restrições especiais, mostre o que você tentou até agora e pergunte sobre o que especificamente está confundindo você.

18
Por favor, também, marque sua lição de casa com a etiqueta [lição de casa].
S.Lott

Respostas:


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 modo de texto é Python 3 apenas. Além disso, você fornece um gerenciador de contexto para o arquivo de saída, mas não fecha o arquivo de entrada, o que parece inconsistente.
Steven Rumbalski

1
@katrielalex: Não há votos negativos, eu simplesmente não votei a favor. Mas dar respostas aos deveres de casa não
BlueRaja - Danny Pflughoeft

Uh, não notei que isso foi marcado com "lição de casa". Não vou deletar minha resposta, mas serei mais cuidadoso no futuro
Gareth Davidson

21
“dar respostas aos problemas do dever de casa” é um comentário extremamente estúpido. Se alguém quer ajuda, ajude-o. Nem todo mundo está procurando fazer seu HW, alguns realmente querem aprender algo ...
KingMak

5
Eu precisava disso para o dever de casa e me ajudou imensamente
mikeybeck

78

Se você quiser substituir as strings no mesmo arquivo, provavelmente terá que ler seu conteúdo em uma variável local, fechá-la e reabri-la para gravação:

Estou usando a instrução with neste exemplo, que fecha o arquivo depois que o withbloco é encerrado - normalmente quando o último comando termina de ser executado ou por uma exceção.

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 ressaltar que se os nomes dos arquivos fossem diferentes, poderíamos ter feito isso de forma mais elegante com um único withcomando.


Esta solução é melhor porque você não renomeia o arquivo ao contrário da resposta acima.

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
Curta e concisa, melhor resposta IMO
Briford Wylie

11

Algo como

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

<do stuff with the result>

OP mencionou "quaisquer ocorrências", o que significa, mesmo quando é uma substring - o que não funcionará no seu exemplo.
Durdu de

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

Se os arquivos de entrada e saída fossem diferentes, você usaria duas variáveis ​​diferentes para read_texte write_text.

Se você quisesse uma mudança mais complexa do que uma única substituição, você atribuiria o resultado de read_texta uma variável, processaria e salvaria o novo conteúdo em outra variável e, em seguida, salvaria o novo conteúdo com write_text.

Se o seu arquivo for grande, você prefere uma abordagem que não leia todo o arquivo na memória, mas que o processe linha por linha, conforme mostrado por Gareth Davidson em outra resposta ( https://stackoverflow.com/a/4128192/3981273 ) , que obviamente requer o uso de dois arquivos distintos para entrada e saída.


write_text não está funcionando para mim. Não está atualizando o arquivo
Anurag

0

maneira mais fácil é fazer isso com expressões regulares, supondo que você deseja iterar em cada linha do arquivo (onde 'A' seria armazenado), você faz ...

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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.