读取包含中文字符的 CSV 文件时出现 UnicodeDecodeError
UnicodeDecodeError when reading a CSV file with Chinese characters
我正在尝试将中文 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
该文件不是 UTF8 编码的,从错误中可以看出这一点。用编辑器打开csv提示可能是latin2
,这显然是错误的,因为它不包含汉字。果然,使用该编码 "works" (不会引发错误)但是是乱码:
Chapter,Content,Score
1.1.1,ŹO§_¤wĹçĂŇŤ~˝č¨t˛ÎŠŇťÝŞşŚUśľşŢ¨îŹyľ{ĄH,1
查看 standard encodings shipping with python 有 big5
和 big5hkscs
用于繁体中文。当 print
ed:
时,两者都给出相同的结果
Chapter,Content,Score
1.1.1,是否已驗證品質系統所需的各項管制流程?,1
这是否有意义只能由会说中文的人来回答,但转换成功且无错误的事实有点令人鼓舞。
这是您的问题的可重现示例。您必须使用正确的编码。注意 codecs
是一个旧模块,Python 3 中的内置 open
直接使用编码:
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標準的要求?
我正在尝试将中文 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
该文件不是 UTF8 编码的,从错误中可以看出这一点。用编辑器打开csv提示可能是latin2
,这显然是错误的,因为它不包含汉字。果然,使用该编码 "works" (不会引发错误)但是是乱码:
Chapter,Content,Score
1.1.1,ŹO§_¤wĹçĂŇŤ~˝č¨t˛ÎŠŇťÝŞşŚUśľşŢ¨îŹyľ{ĄH,1
查看 standard encodings shipping with python 有 big5
和 big5hkscs
用于繁体中文。当 print
ed:
Chapter,Content,Score
1.1.1,是否已驗證品質系統所需的各項管制流程?,1
这是否有意义只能由会说中文的人来回答,但转换成功且无错误的事实有点令人鼓舞。
这是您的问题的可重现示例。您必须使用正确的编码。注意 codecs
是一个旧模块,Python 3 中的内置 open
直接使用编码:
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標準的要求?