UnicodeDecodeError при чтении файла CSV с китайскими символами - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь проиндексировать китайский CSV как документ в Elasticsearch. Данные в CSV начинаются со следующих байтов:

b'Chapter,Content,Score\r\n1.1.1,\xacO\xa7_\xa4w\xc5\xe7\xc3\xd2\xab~\xbd\xe8\xa8t\xb2\xce\xa9\xd2\xbb\xdd\xaa\xba\xa6U\xb6\xb5\xba\xde\xa8\xee\xacy\xb5{\xa1H,1\r\n1.1.2,\xab~\xbd\xe8\xba\xde\xb2z\xa8t\xb2\xce\xacO\xa7_\xb2\xc5\xa6XISO\xbc\xd0\xb7\xc7\xaa\xba\xadn\xa8D\xa1H,1\r\n'

А код простой, как показано ниже

import csv
import json
import pandas as pd
from elasticsearch import Elasticsearch
es=Elasticsearch("https://xxx.us-east-1.es.amazonaws.com/")
from elasticsearch import helpers
import codecs
def csv_reader(file_name):
es = Elasticsearch("https://xxx.us-east-1.es.amazonaws.com/")
with codecs.open(file_name, 'r', 'utf-8') as outfile:
    reader = csv.DictReader(outfile)
    helpers.bulk(es, reader, index="checklist", doc_type="quality")
if __name__ == "__main__":
with open('checklist1.csv') as f_obj:
    csv_reader('checklist1.csv')

А затем сообщение об ошибке ниже:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xac in position 0: invalid start byte

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Вот воспроизводимый пример вашей проблемы.Вы должны использовать правильную кодировку.Примечание codecs - это старый модуль, а встроенный open в Python 3 работает с кодировками напрямую:

import csv

s = b'Chapter,Content,Score\r\n1.1.1,\xacO\xa7_\xa4w\xc5\xe7\xc3\xd2\xab~\xbd\xe8\xa8t\xb2\xce\xa9\xd2\xbb\xdd\xaa\xba\xa6U\xb6\xb5\xba\xde\xa8\xee\xacy\xb5{\xa1H,1\r\n1.1.2,\xab~\xbd\xe8\xba\xde\xb2z\xa8t\xb2\xce\xacO\xa7_\xb2\xc5\xa6XISO\xbc\xd0\xb7\xc7\xaa\xba\xadn\xa8D\xa1H,1\r\n'

# Create a file with your sample byte string
with open('checklist.csv','wb') as f:
    f.write(s)

# Open it with the correct encoding and newline requirements for using DictReader.
with open('checklist.csv',encoding='big5',newline='') as f:
    r = csv.DictReader(f)
    for line in r:
        print(line['Content'])

Вывод:

是否已驗證品質系統所需的各項管制流程?
品質管理系統是否符合ISO標準的要求?
0 голосов
/ 27 октября 2018

Файл не в кодировке UTF8, что довольно ясно из ошибки.Открытие csv с редактором показало, что это может быть latin2, что явно неверно, поскольку в нем нет китайских символов.Конечно, использование этой кодировки «работает» (не вызывает ошибку), но является бредом:

Chapter,Content,Score
1.1.1,ŹO§_¤wĹçĂŇŤ~˝č¨t˛ÎŠŇťÝŞşŚUśľşŢ¨îŹyľ{ĄH,1

Рассматривая стандартную кодировку, поставляемую с python , есть big5 и big5hkscs для традиционного китайского.Оба из них дают один и тот же результат, когда print ed:

Chapter,Content,Score
1.1.1,是否已驗證品質系統所需的各項管制流程?,1

Может ли кто-нибудь говорить по-китайски, на этот вопрос может ответить только тот факт, что преобразование прошло успешно без ошибок, немного обнадеживающе.

...