Dúvida sobre a codificação no PyCharm

26/03/2023

0

Estava estudando como remover palavras em arquivos usando Python. Eu adicionava duas palavras no arquivo, uma normal e a outra rasurada. Antes de realizar a remoção, ao abrir o arquivo, as palavras ficavam normais, porém após a remoção da palavra não rasurada, ficava uma linha em branco e a palavra com rasura ficava bugada. Já mudei o código e a codificação do PyCharm várias vezes, mas continua assim. Alguém sabe o que devo fazer?

Essa foi minha última tentativa:

import codecs
import unicodedata

texto = "Rasurado"
texto_normalizado = unicodedata.normalize(''NFKD'', texto)

texto_riscado = ''.join([''\u0336{}''.format(c) for c in texto_normalizado])

with codecs.open("test.txt", "w", encoding="utf-8-sig") as texto_inicial:
    texto_inicial.write(texto_normalizado)


with codecs.open("test.txt", "a", encoding="utf-8-sig") as texto_inicial:
    texto_inicial.write(f"\n")

with codecs.open("test.txt", "r", encoding="utf-8-sig") as file:
    print(file.read())

with codecs.open("test.txt", "r+", encoding="utf-8-sig") as file:
    content = file.readlines()

    for line in range(len(content)):
        if texto_normalizado in content[line]:
            content[line] = content[line].replace(texto_normalizado, '')

    file.seek(0)
    file.write(''.join(content))
Ryan Santos

Ryan Santos

Responder

Posts

07/12/2023

Leticia Lima

Eu acho que o problema pode ser no caractere de rasura ('\\u0336') no momento da escrita no seu arquivo, de como o PyCharm está interpretando esse caractere.
Aqui está uma alternativa de como eu tentaria resolver isso.

PS: já tentou usar outra IDE ?

import codecs
import unicodedata

def rasurar_palavra(palavra):
    texto_normalizado = unicodedata.normalize('NFKD', palavra)
    texto_riscado = ''.join(['\\u0336{}'.format(c) for c in texto_normalizado])
    return texto_normalizado, texto_riscado

def remover_palavra_arquivo(nome_arquivo, palavra):
    texto_normalizado, texto_riscado = rasurar_palavra(palavra)

    # Escreve a palavra riscada no arquivo
    with codecs.open(nome_arquivo, "w", encoding="utf-8-sig") as arquivo:
        arquivo.write(texto_riscado)

    # Adiciona uma linha em branco
    with codecs.open(nome_arquivo, "a", encoding="utf-8-sig") as arquivo:
        arquivo.write("\\n")

    # Lê o conteúdo do arquivo
    with codecs.open(nome_arquivo, "r", encoding="utf-8-sig") as arquivo:
        print(arquivo.read())

    # Remove a palavra não riscada do arquivo
    with codecs.open(nome_arquivo, "r+", encoding="utf-8-sig") as arquivo:
        content = arquivo.readlines()

        for line in range(len(content)):
            if texto_normalizado in content[line]:
                content[line] = content[line].replace(texto_normalizado, '')

        arquivo.seek(0)
        arquivo.write(''.join(content))

# Exemplo de uso
remover_palavra_arquivo("test.txt", "Rasurado")
Responder

07/12/2023

Arthur Heinrich

Acho que seu problema está nesse trecho de código

    for line in range(len(content)):
        if texto_normalizado in content[line]:
            content[line] = content[line].replace(texto_normalizado, '')


Se o "texto_normalizado" aparece na linha do arquivo, você está substituindo o conteúdo da linha, removendo o "texto_normalizado".

Imagine que sua linha contém o texto "picolé de morango" e o seu texto normalizado vale "morango". Como resultado sua linha vai aparecer como "picolé de ". Porém, se o texto normalizado coincide com a linha toda, a linha ficará em branco.

Se você quer que linhas em branco após a substituição sejam eliminadas, precisará excluí-las do arquivo. Algo como:

    for line in range(len(content)):
        if texto_normalizado in content[line]:
            content[line] = content[line].replace(texto_normalizado, '')
            if (content[line] == ''):
                content.delete(line)


Lembrando que é um exemplo. Não conheço as funções e sintaxe da linguagem.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar