python使用pd.read_csv(),出现错误UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xc8

问题描述:

在使用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'),无报错。

你可能感兴趣的:(python/matlab,python)