Estou lendo e analisando um arquivo Amazon XML e, embora o arquivo XML mostre um ', quando tento imprimi-lo, recebo o seguinte erro:
'ascii' codec can't encode character u'\u2019' in position 16: ordinal not in range(128)
Pelo que li online até agora, o erro vem do fato de que o arquivo XML está em UTF-8, mas o Python quer tratá-lo como um caractere codificado em ASCII. Existe uma maneira simples de eliminar o erro e fazer com que meu programa imprima o XML durante a leitura?
unicode()
?Respostas:
Provavelmente, o seu problema é que você o analisou bem e agora está tentando imprimir o conteúdo do XML e não consegue porque existem alguns caracteres Unicode estrangeiros. Tente codificar sua string Unicode como ascii primeiro:
a parte 'ignorar' dirá para simplesmente pular esses caracteres. Dos documentos do python:
Você pode querer ler este artigo: http://www.joelonsoftware.com/articles/Unicode.html , que achei muito útil como um tutorial básico sobre o que está acontecendo. Após a leitura, você deixará de sentir que está apenas adivinhando quais comandos usar (ou pelo menos isso aconteceu comigo).
fonte
.encode('ascii', 'ignore')
perde dados desnecessariamente, mesmo se o ambiente do OP puder suportar caracteres não ASCII (na maioria dos casos)Uma solução melhor:
Se você gostaria de ler mais sobre o motivo:
http://docs.plone.org/manage/trouwagen/unicode.html#id1
fonte
u'\u2019
já é Unicode.Não fixe a codificação de caracteres de seu ambiente dentro de seu script; imprima texto Unicode diretamente em vez disso:
Se sua saída for redirecionada para um arquivo (ou canal); você pode usar
PYTHONIOENCODING
envvar para especificar a codificação de caracteres:Caso contrário,
python your_script.py
deve funcionar como é - suas configurações locais são utilizados para codificar o texto (no check POSIX:LC_ALL
,LC_CTYPE
,LANG
envvars - setLANG
a um locale UTF-8 se necessário).Para imprimir Unicode no Windows, veja esta resposta que mostra como imprimir Unicode no console do Windows, em um arquivo ou usando o IDLE .
fonte
Excelente postagem: http://www.carlosble.com/2010/12/understanding-python-and-unicode/
fonte
Você pode usar algo na forma
que irá converter um bytestring codificado em UTF-8 em uma string Python Unicode. Mas o procedimento exato a ser usado depende exatamente de como você carrega e analisa o arquivo XML, por exemplo, se você nunca acessa a string XML diretamente, pode ser necessário usar um objeto decodificador do
codecs
módulo .fonte
'...'.encode('utf-8')
Escrevi o seguinte para consertar as cotações não-ascii incômodas e forçar a conversão para algo utilizável.
fonte
Se você precisar imprimir uma representação aproximada da string na tela, em vez de ignorar os caracteres não imprimíveis, tente o
unidecode
pacote aqui:https://pypi.python.org/pypi/Unidecode
A explicação pode ser encontrada aqui:
https://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/
Isso é melhor do que usar o
u.encode('ascii', 'ignore')
para uma determinada stringu
e pode evitar dores de cabeça desnecessárias se a precisão do caractere não for o que você procura , mas ainda deseja ter legibilidade humana.Wirawan
fonte
Tente adicionar a seguinte linha no início do seu script Python.
fonte
Python 3.5, 2018
Se você não sabe qual é a codificação, mas o analisador Unicode está tendo problemas, você pode abrir o arquivo
Notepad++
e selecionar na barra superiorEncoding->Convert to ANSI
. Então você pode escrever seu python assimfonte