Stack Overflow em Português Asked by Arcyde on September 26, 2021
Saudações,
quando vou adicionar um ";" ao final do arquivo, mesmo especificando que não é pra adicionar caso já termine com ele, ainda é adicionado:
newf=""
with open('teste.txt','r') as f:
for line in f:
lastchar = line[-1]
print(lastchar)
if lastchar != ';':
newf+=line.strip()+";n"
else:
newf+=line.strip()
f.close()
with open('teste.txt','w') as f:
f.write(newf)
f.close()
O texto que é:
1;2
2;2;
3;3
Fica
1;2;
2;2;;
3;3;
Como resolver?
Em primeiro lugar, algumas considerações sobre o seu código:
Se você está usando um context manager com with open(...
, você não precisa fechar o arquivo com f.close()
. O context manager faz isso por você.
Sugiro que você não sobrescreva o arquivo de entrada, principalmente com dados em memória. Se alguma coisa der errado durante a gravação do arquivo final e o programa terminar com erro, você perde os dados processados e o arquivo original. Grave um arquivo temporário e renomeie o arquivo temporário para o original, no fim do processamento.
Na mesma linha do item anterior, não coloque tudo em memória para então começar a escrever no arquivo de destino. Isso funciona bem para um arquivo pequeno, mas se o arquivo tiver 100GB, haja memória... Grave o arquivo linha a linha.
Você também não precisa abrir um arquivo usando um context manager, colocar todo o resultado na memória e depois usar outro context manager para abrir o mesmo arquivo (ou outro) para escrever o resultado. Abra os dois arquivos, de entrada e de saída no mesmo context manager.
Fazendo funcionar
O problema é que você só está considerando o caracter de quebra de linha depois do if
. Você poderia remover a quebra de linha antes de testar se o ';'
está lá.
Mas você também pode manter assim, testando a string a partir da penúltima posição, com o método endswith()
e só remover a quebra nas linhas onde você for adicionar o ';'
. E faça só o rstrip()
, porque o início da linha não importa.
Depois, adicione a quebra de linha de volta usando 'n'
, só nas linhas alteradas.
Ficaria assim:
with open('teste.txt','r') as inFile,
open('teste.tmp.txt', 'w') as outFile:
for line in inFile:
if not line.endswith(';', -2, len(line) - 1):
line = line.rstrip() + ';n'
outFile.write(line)
Ou, se você quiser programar no modo "garantia de emprego"... :)
with open('teste.txt','r') as inFile, open('teste.tmp.txt', 'w') as outFile: outFile.write(''.join([line.rstrip() + ';n' if not line.endswith(';', -2, (len(line) - 1)) else line for line in inFile]))
Correct answer by Guilherme Brügger on September 26, 2021
Não parece ter nenhum erro na sua lógica, mas o fato dele estar retornando falso sempre no if significa que a variável lastchar
não é ponto e vírgula como você esperava. Muito provavelmente isso está acontecendo porque line
tem espaços em branco no final, ou seja se você fizer lastchar = line.rstrip()[-1]
, deve resolver o problema.
Answered by renatomt on September 26, 2021
O problema é que cada final de linha do arquivo tem uma quebra de linha("n"). Uma solução é chamar o método replace
do str
para substituir o "n" por "".
Answered by user1465285 on September 26, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP