Em um arquivo de texto, há uma string "Não gosto disso".
No entanto, quando leio em uma string, torna-se "I don \ xe2 \ x80 \ x98t assim". Eu entendo que \ u2018 é a representação unicode de "'". eu uso
f1 = open (file1, "r")
text = f1.read()
comando para fazer a leitura.
Agora, é possível ler a string de tal forma que, quando for lida na string, seja "Não gosto disso", em vez de "Não \ xe2 \ x80 \ x98t assim"?
Segunda edição: vi algumas pessoas usarem o mapeamento para resolver esse problema, mas realmente, não há nenhuma conversão embutida que faça esse tipo de conversão ANSI para Unicode (e vice-versa)?
Respostas:
Ref: http://docs.python.org/howto/unicode
Ler Unicode de um arquivo é, portanto, simples:
Também é possível abrir arquivos em modo de atualização, permitindo leitura e gravação:
EDIT : Estou assumindo que seu objetivo pretendido é apenas ser capaz de ler o arquivo corretamente em uma string em Python. Se você está tentando converter para uma string ASCII de Unicode, não há realmente uma maneira direta de fazer isso, já que os caracteres Unicode não existem necessariamente em ASCII.
Se você estiver tentando converter para uma string ASCII, tente uma das seguintes opções:
Substitua os caracteres Unicode específicos por equivalentes ASCII, se você estiver procurando apenas para lidar com alguns casos especiais, como este exemplo particular
Use o
unicodedata
módulonormalize()
e ostring.encode()
método para converter da melhor forma possível para o próximo equivalente ASCII mais próximo (Ref https://web.archive.org/web/20090228203858/http://techxplorer.com/2006/07/18/converting- unicode-to-ascii-using-python ):fonte
codecs
módulo não controla o modo de nova linha universal corretamente. Emio.open()
vez disso, use no Python 2.7+ (é integradoopen()
no Python 3).Existem alguns pontos a serem considerados.
Um caractere \ u2018 pode aparecer apenas como um fragmento de representação de uma string Unicode em Python, por exemplo, se você escrever:
Agora, se você simplesmente deseja imprimir a string Unicode de maneira bonita, basta usar o
encode
método Unicode :Para garantir que todas as linhas de qualquer arquivo sejam lidas como unicode, é melhor usar a
codecs.open
função em vez de apenasopen
, que permite especificar a codificação do arquivo:fonte
Mas é realmente "Eu não gosto disso" e não "Eu não gosto disso". O caractere u '\ u2018' é um caractere completamente diferente de "'" (e, visualmente, deve corresponder mais a' `').
Se você está tentando converter Unicode codificado em ASCII simples, talvez possa manter um mapeamento de pontuação Unicode que gostaria de traduzir para ASCII.
Há uma grande quantidade de caracteres de pontuação em Unicode , no entanto, mas suponho que você possa contar com apenas alguns deles sendo realmente usados por qualquer aplicativo que esteja criando os documentos que você está lendo.
fonte
Também é possível ler um arquivo de texto codificado usando o método de leitura python 3:
Com esta variação, não há necessidade de importar nenhuma biblioteca adicional
fonte
Deixando de lado o fato de que seu arquivo de texto está corrompido (U + 2018 é uma aspa esquerda, não um apóstrofo): iconv pode ser usado para transliterar caracteres Unicode para ascii.
Você terá que procurar por "iconvcodec" no Google, já que o módulo parece não ser mais compatível e não consigo encontrar uma página inicial canônica para ele.
Como alternativa, você pode usar o
iconv
utilitário de linha de comando para limpar seu arquivo:fonte
Existe a possibilidade de que de alguma forma você tenha uma string não Unicode com caracteres de escape Unicode, por exemplo:
Isso realmente aconteceu comigo uma vez antes. Você pode usar um
unicode_escape
codec para decodificar a string para unicode e, em seguida, codificá-la para qualquer formato que desejar:fonte
Esta é a maneira do Pythons mostrar strings codificadas em Unicode. Mas acho que você deve conseguir imprimir a string na tela ou gravá-la em um novo arquivo sem problemas.
fonte
Na verdade, U + 2018 é a representação Unicode do caractere especial '. Se desejar, você pode converter instâncias desse caractere em U + 0027 com este código:
Além disso, o que você está usando para gravar o arquivo?
f1.read()
deve retornar uma string parecida com esta:Se estiver retornando esta string, o arquivo está sendo escrito incorretamente:
fonte