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"?

Joey
fonte
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'))
Gareth Davidson
fonte
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.

Adam Matan
fonte
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)
Mark Kahn
fonte
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>
TartanLlama
fonte
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)
Falmarri
fonte
6

Se você estiver no Linux e quiser apenas substituir a palavra dogpor, catpode fazer:

text.txt:

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

Comando Linux:

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

Resultado:

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

Postagem original: /ubuntu/20414/find-and-replace-text-within-a-file-using-commands

user1767754
fonte
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.

Jorge Moraleda
fonte
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)
Austinbv
fonte