Estou usando Python-2.6 CGI
scripts, mas encontrei esse erro no log do servidor enquanto fazia isso json.dumps()
,
Traceback (most recent call last):
File "/etc/mongodb/server/cgi-bin/getstats.py", line 135, in <module>
print json.dumps(__getdata())
File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa5 in position 0: invalid start byte
Aqui
__getdata()
função retorna dictionary {}
.
Antes de postar esta pergunta, referi -a à questão do SO.
ATUALIZAÇÕES
A linha a seguir está afetando o codificador JSON,
now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps({'current_time': now}) // this is the culprit
Eu tenho uma correção temporária para isso
print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })
Mas não tenho certeza se é a maneira correta de fazê-lo.
dict
?dict
temlist, dict, python timestamp value
__getdata
. Não sei por que você está recebendo um personagem não decodível. Você pode tentar criar patches no dict para fazê-lo funcionar, mas na maioria das vezes eles estão apenas pedindo mais problemas. Eu tentaria imprimir o dict para ver onde está o caractere não-ascii. Em seguida, descubra como esse campo foi calculado / definido e trabalhe para trás a partir daí.Respostas:
O erro ocorre porque existe algum caractere não-ascii no dicionário e ele não pode ser codificado / decodificado. Uma maneira simples de evitar esse erro é codificar essas cadeias com a
encode()
função a seguir (sea
for a cadeia com caracteres não ascii):fonte
Eu mudei isso simplesmente definindo um pacote de codec diferente no
read_csv()
comando:encoding = 'unicode_escape'
Por exemplo:
fonte
pandas
Experimente o trecho de código abaixo:
fonte
r
vez derb
. obrigado pelo lembrete de adicionarb
!open
função tem 'r' como modo somente leitura.rb
significa modo binário de leitura.Sua string possui um
ascii
caractere não codificado.Não conseguir decodificar
utf-8
pode acontecer se você precisar usar outras codificações no seu código. Por exemplo:Nesse caso, a codificação é o
windows-1252
que você deve fazer:Agora que você possui
Unicode
, pode codificar com segurançautf-8
.fonte
Na leitura
csv
, adicionei um método de codificação:fonte
Defina o codificador padrão na parte superior do seu código
fonte
A partir de 2018-05, isso será tratado diretamente com
decode
, pelo menos no Python 3 .Eu estou usando o abaixo trecho para
invalid start byte
einvalid continuation byte
erros de tipo. Adicionandoerrors='ignore'
corrigido para mim.fonte
Inspirado por @aaronpenne e @Soumyaansh
fonte
Esta solução funcionou para mim:
fonte
Solução Simples:
fonte
A linha a seguir está afetando o codificador JSON,
Eu tenho uma correção temporária para isso
Marcar isso como correto como uma correção temporária (não tenho certeza).
fonte
Se os métodos acima não estiverem funcionando para você, convém alterar a codificação do próprio arquivo csv.
Usando o Excel:
Usando o bloco de notas:
Ao fazer isso, você poderá importar arquivos csv sem encontrar o UnicodeCodeError.
fonte
Depois de tentar todas as soluções alternativas mencionadas, se ele ainda gerar o mesmo erro, tente exportar o arquivo como CSV (uma segunda vez, se você já tiver). Especialmente se você estiver usando o scikit learn, é melhor importar o conjunto de dados como um arquivo CSV.
Passei horas juntos, enquanto a solução era simples. Exporte o arquivo como um CSV para o diretório em que o Anaconda ou suas ferramentas classificadoras estão instaladas e tente.
fonte
Você pode usar qualquer codificação padrão do seu uso e entrada específicos.
utf-8
é o padrão.iso8859-1
também é popular na Europa Ocidental.por exemplo:
bytes_obj.decode('iso8859-1')
veja: docs
fonte
Em vez de procurar maneiras de decodificar a5 (Yen
¥
) ou 96 (en-dash–
), diga ao MySQL que seu cliente está codificado "latin1", mas você deseja "utf8" no banco de dados.Veja detalhes em Problemas com caracteres UTF-8; o que vejo não é o que guardei
fonte