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.