工作总结

python read_csv遇到的encoding字符编码问题总结

| 点击:

【www.fsgl168.com--工作总结】

一、博客背景

我偶尔会接到把csv导入数据库的任务,我通常都是先用pd.read_csv读取文件数据,接着用df.to_sql导入数据库。有时read_csv会遇到不同的字符编码问题,我的解决方法通常是把常用的几种字符编码挨个试一下,哪种结果正确就选择哪一种。

二、博客目的

今天在这里,把我遇到的几种字符编码梳理汇总一下,方便自己和大家以后查询。

三、可以参考的字符编码

1、我在read_csv遇到过的字符编码

这里先放一下我用read_csv遇到过的编码吧。

reader = pd.read_csv(file_path , sep='\t' # , encoding='gb18030' # , encoding='unicode_escape' , encoding='utf-16' # , encoding='utf-8' # , nrows=5 , chunksize=20000 )

我们主要看encoding参数,其他参数这里不讨论。

有的csv文件不加encoding参数也能顺利读取,有的用utf-8就行,但是遇到极个别刁钻的,则需要用其他编码方式。

编码方式如果想要搞透彻需要多看几篇博客了,等我研究后再添加到文后。

下面我之前遇到的编码方式的问题,如果你不幸也到了编码问题,就试下上面几种encoding,如果还不行就查阅其他网页吧。

2、常见的bug

UnicodeDecodeError: utf-8 codec can t decode byte 0xb3 in position 732: invalid start byte

2、UnicodeDecodeError: 'utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte

3、UnicodeDecodeError: 'gb18030’ codec can’t decode byte 0xff in position 0: illegal multibyte sequence

四、浅谈字符编码问题

1、数字怎么编码

一个bit可以是数字0或者是数字1,一个字节由8个bit组成,全是0表示数字0,全是1表示数字255,由排列组合可以计算出8个bit共有2^8=256种不同组合,所以一个字节可以表示数字0~255共256个数字。在计算机中,数字是这样编码。

2、字符怎么编码

一堆二进制的0和1怎么也算不出字母A吧,那怎么用0和1表示字母A呢?直接表示行不通,就用间接的方法吧,用数字中转一下,给字母A指定一个数字编号,比如数字65(注:博客中所有字母或汉字的编号都是编造的,后续查到正确的再替换)。在计算机里,存储字母A时,存储数字65对应的二进制编码,要读取时,先把二进制编码转成数字编码,再查看数字编码对应的字母。

把符号和编号一一对应收录起来就是字符集了。

2.1 ASCII字符集

ASCII字符集(1967年)是美国人专门为英文设计的,收录了128个字符,包括大小写字母、数字0-9、标点符号、非打印字符(换行符、制表符等4个)以及控制字符(退格、响铃等)。

前面讲到一个字节由8个bit组成,1个bit可以表示0或1共2个数字,由排列组合可以计算出8个bit可以组合出2^8=256个不同的组合,也就是一个字节可以表示256个数字。

这么看来,一个字节就可以完全表示ASCII字符集里任一个字符了。

没有中文怎么行?

2.2 GB2312字符集

GB2312字符集(1980年),国标,中国的字库,包括简体中文、拉丁字母、日文片假名。

没有繁体字怎么行呢?

2.3 BIG5字符集

BIG5字符集(1984年),包含了繁体字。

那其他国家的文字怎么办?

2.4 Unicode字符集

Unicode字符集(1994年),是国际通用的全球化字符集,收录有世界很多国家的文字。既然能表示更多的字符,就需要占用更多的字节,从百科上查到Unicode需要用2个字节。

从集合角度来看,ASCII是Unicode的子集,能用ASCII表达的字符,如果用Unicode表达,前面一个字节就会用0填充,造成存储的浪费。

我更倾向于这样理解,Unicode像个定长编码,能用1个字节表达的用了2个字节就造成了资源的浪费。

此时需要更灵活的编码,UTF就产生了。

2.5 UTF

UTF(Unicode Transformation Format,Unicode转换格式或统一码转换格式),为了解决Unicode定长这个问题而生的,它是可变长度的字符编码,主要有UTF-8、UTF-16、UTF-32等。

UTF-8

1-6个字节组成,汉字由3个字节表示。

(有时间再研究下UTF不同编码之间的联系和差异。)

表格是我根据自己的理解总结的,后面的编码产生的原因都是为了弥补或补充前面编码的功能。

五、愿景

写完这个博客我有2个愿望,

1、希望三、可以参考的字符编码能帮助你解决使用read_csv遇到的encoding问题。

2、希望四、浅谈字符编码能帮助你理解字符编码,知道为什么会有这种字符编码出现以及它的优缺点。

好了,暂时到这里吧,欢迎留言讨论。

本文来源:http://www.fsgl168.com/fanwen/103561/