Oorzaken en oplossingen voor UnicodeDecodeError [Python]

2019 年 6 月 5 日

Toen ik probeerde een dataset in csv-bestandsformaat met panda's te lezen, kwam ik onmiddellijk de foutmelding "UnicodeDecodeError: 'utf-8' codec kan byte 0x91 niet decoderen op positie 1: ongeldige startbyte". Noteer.

fout inhoud

Lees het csv-bestand met pd.read_csv.Dan ...

importeer panda's als pd df = pd.read_csv ('data.csv')

>> UnicodeDecodeFout: 'utf-8' codec kan byte 0x91 niet decoderen in positie 1: ongeldige startbyte

Ik heb een Unicode-decoderingsfout (een tekencode naar een teken geconverteerd).
Het omzetten van tekens naar tekencodes wordt overigens codering genoemd.

reden

In de personal computer worden de tekens niet herkend zoals ze zijn, maar worden ze behandeld als cijfers (tekencodes) die van tevoren aan elk teken zijn toegewezen.

Er zijn veel soorten tekencodes, afhankelijk van de taal en de manier waarop u nummers toewijst. UTF-8 is een van de coderingsmethoden voor Unicode die is ingesteld als een uniforme standaard van de wereldstandaard, zodat deze in elke taal kan worden gebruikt.
UTF-8 lijkt echter ook niet perfect te zijn (Wikipedia:Unicode-problemen in Japanse omgeving)

Ik weet niet welk teken het probleem veroorzaakte, maar aangezien het csv-bestand Japanse tekens bevatte, veroorzaakte de slechte conversie tussen de Japanse tekencode en UTF-8 de Unicode-decoderingsfout.

oplossing

Geef bij het lezen met read_csv () het coderingsformaat op van het argument tot de Japanse tekencode (shift_jis, enz.).

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

Ik heb het met succes kunnen lezen.

Ander Japans compatibel coderingsformaat

Overigens zijn er meerdere tekencodes die Japans kunnen uitdrukken, en Python implementeert standaard het volgende. (Referentie:Lijst met standaard coderingen van 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

Ik heb echter de indruk dat het goed te lezen is met shift_jis of cp932, wat een grote maat is.