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

博客主要围绕使用Python读取表格数据时确定编码方式的问题展开。先提出在读取表格数据时指定常用编码仍可能报错的问题,接着给出解决办法,指出表格编码存在整体单一编码和多种编码两种情况,并分别介绍了确定这两种情况编码方式的具体操作。
该文章已生成可运行项目,

问题描述:

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

本文章已经生成可运行项目
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值