TransWikia.com

Adicionar character no fim da linha

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?

3 Answers

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP