Causas e soluções para UnicodeDecodeError [Python]

2019 ano 6 mês 5 dia

Quando tentei ler um conjunto de dados em formato de arquivo csv com o pandas, encontrei imediatamente o erro "UnicodeDecodeError: o codec 'utf-8' não pode decodificar o byte 0x91 na posição 1: byte inicial inválido".

conteúdo de erro

Leia o arquivo csv com pd.read_csv.Então ...

importar pandas como pd df = pd.read_csv ('data.csv')

>> UnicodeDecodeError: o codec 'utf-8' não pode decodificar o byte 0x91 na posição 1: byte inicial inválido

Recebi um erro de decodificação Unicode (conversão de um código de caractere em um caractere).
A propósito, a conversão de caracteres em códigos de caracteres é chamada de codificação.

Causa

Dentro do computador pessoal, os caracteres não são reconhecidos como são, mas são tratados como números (códigos de caracteres) atribuídos a cada caractere antecipadamente.

Existem muitos tipos de códigos de caracteres, dependendo do idioma e de como atribuir números. UTF-8 é um dos métodos de codificação para Unicode definido como um padrão unificado do padrão mundial para que possa ser usado em qualquer idioma.
No entanto, o UTF-8 também não parece ser perfeito (Wikipedia:Problemas de Unicode em ambiente japonês)

Não sei o caractere que causou o problema, mas como o arquivo csv continha caracteres japoneses, a conversão deficiente entre o código de caracteres japoneses e UTF-8 causou o erro de decodificação Unicode. Parece que sim.

解決 策

Ao ler com read_csv (), especifique o formato de codificação do argumento para o código de caractere japonês (shift_jis, etc.).

df = pd.read_csv ('data.csv', encoding = 'shift_jis')

Consegui ler com sucesso.

Outro formato de codificação compatível com o japonês

A propósito, existem vários códigos de caracteres que podem expressar japonês, e Python implementa o seguinte como padrão. (Referência:Lista de codificações padrão do Python )

  • cp932
  • euc_jp, euc_jis_2004, euc_jisx0213
  • iso2022_jp, iso2022_jp_1, iso2022_jp_2, iso2022_jp_3
  • iso2022_jp_2004, iso2022_jp_2ext
  • shift_jis, shift_jis _2004, shift_jisx0213

No entanto, tenho a impressão de que pode ser lido bem com shift_jis ou cp932, que é uma medida importante.