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].
"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 notin s:print('"{old_string}" not found in {filename}.'.format(**locals()))return# Safely write the changed content, if found in the filewith 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.
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)
from pathlib importPath
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)
Respostas:
fonte
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
with
bloco é encerrado - normalmente quando o último comando termina de ser executado ou por uma exceção.Vale ressaltar que se os nomes dos arquivos fossem diferentes, poderíamos ter feito isso de forma mais elegante com um único
with
comando.fonte
fonte
Algo como
fonte
fonte
Se você estiver no Linux e quiser apenas substituir a palavra
dog
por,cat
pode fazer:text.txt:
Comando Linux:
Resultado:
Postagem original: /ubuntu/20414/find-and-replace-text-within-a-file-using-commands
fonte
Usando pathlib ( https://docs.python.org/3/library/pathlib.html )
Se os arquivos de entrada e saída fossem diferentes, você usaria duas variáveis diferentes para
read_text
ewrite_text
.Se você quisesse uma mudança mais complexa do que uma única substituição, você atribuiria o resultado de
read_text
a uma variável, processaria e salvaria o novo conteúdo em outra variável e, em seguida, salvaria o novo conteúdo comwrite_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.
fonte
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 ...
fonte