在使用pd.read_csv()
读取表格数据时,有"encoding="
参数用来描述表格数据采用的编码方式,比较常用的有utf-8
,但有时候还是会报错。示例如下:
import pandas as pd
file_path = "oracle_log.csv"
data = pd.read_csv(file_path, encoding='utf-8')
报错内容为:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 0: invalid continuation byte
说明’utf-8’ 不能解码0xc8。
但如何确定表格的编码方式呢?
表格的编码方式存在两种情况,一种是表格整体以一种方式编码,另一种是表格中存在多种编码方式。
使用记事本打开csv文件,红框所示即csv文件的编码方式。
则更改为data = pd.read_csv(file_path, encoding='ANSI')
一般地,测试无报错,则说明表格整体以单一方式编码。
特殊地,上述情况仍然有报错。则测试是否存在多种编码方式:
f = open(file_path,"rb")# 二进制格式读文件
i = 0
while True:
i += 1
line = f.readline() # 按行读取
if not line:
break
else:
try:
line.decode('ANSI')
except: # 打印出不能通过'ANSI'方式解码的数据行
print(i)
print(str(line))
输出内容示例:
38999 # 代表csv文件的第38999行
b'36:50.5,59107,1521,6,49:35.9,136.6.5.43,192.168.181.198,ODSQUERY,\xff\xff\xff\xff\xff\xff,,chenwenfeng,,PLSQLDev,,,,,,,,,,\r\n' # 代表不能通过'ANSI'方式解码的数据行内容
如何确定报错的这一行数据的编码方式:
使用python库chardet
检测编码方式(对单行数据检测比较有效)
import chardet # import失败则 pip install chardet
error_line = b'36:50.5,59107,1521,6,49:35.9,136.6.5.43,192.168.181.198,ODSQUERY,\xff\xff\xff\xff\xff\xff,,chenwenfeng,,PLSQLDev,,,,,,,,,,\r\n'
print(chardet.detect(error_line))
输出内容:
{
'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''}
经测试,对上述报错行使用error_line.decode('ISO-8859-1')
,无报错。