Pandas读取中文文本文件报错:python ‘utf-8‘ codec can‘t decode byte 0xe3 in position 0: unexpected end of data

近日用pandas的read_csv读取中文文本文件时报错:python 'utf-8' codec can't decode byte 0xe3 in position 0: unexpected end of data。

看到错误以为是读取时encoding选择错误,某个二进制块无法用 'utf-8'读取,不应该选择 'utf-8'。于是将utf-8,gb2312,gb18030,gbk,utf-8-sig,cp936,big5等中文编码都试了一遍,还是没有解决错误。用编码ISO-8859-1读取没有报错,然而读取的是乱码。

要读取的文件,我事先知道是 'utf-8'。为了再次确认是否是 'utf-8',用如下代码进行了判断,结果竟然是none。用文本编辑器打开文件,将文件编码转换为 'utf-8',再次用如下代码进行判断,结果竟然还是none。

#方法一
import pandas as pd   

import os  

import chardet

def get_encoding(filename): 

    """ 

    返回文件编码格式,因为是按行读取,所以比较适合小文件

    """ 

    with open(filename,'rb') as f: 

        return chardet.detect(f.read())['encoding']

original_file = r"G:\data.txt"

print(get_encoding(original_file))
#结果是None

#方法二
from chardet.universaldetector import UniversalDetector

original_file = r"G:\data.txt"
 
usock = open(original_file, 'rb')
detector = UniversalDetector()
for line in usock.readlines():
    detector.feed(line)
    if detector.done: break
detector.close()
usock.close()
print (detector.result)

#返回结果竟然是{'encoding': None, 'confidence': 0.0, 'language': None}
#chardet不可能总是正确的猜测。如果你需要正确处理样本,你真的需要知道它们的编码

#方法三
#notepad++右下角也能看到编码,结果是utf-8

说明,文件的部分数据有问题,在网上找了很多方法,都不能解决问题。

随后,用如下代码找到了错误出现的行,错误出现在最后一行。

f = open(r"G:\data.txt","rb")#二进制格式读文件
while True:
    line = f.readline()
    if not line:
        break
    else:
        try:
            line.decode('utf-8')
         
        except:
            print(str(line))

重新看报错原因,才发现“unexpected end of data”,这不也是在说最后一行吗?

观察了下最后一行的数据,文件有6列数据,然而最后一行只有3列数据,最后3列数据为空,手动将最后3列数据补全,问题解决。

总结:仔细读报错原因,报错原因其实已经告诉了解决思路。找出导致出错所在的代码行或数据行,不要瞎试。

你可能感兴趣的:(python,python,pycharm,机器学习,pandas)