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

一、博客背景

我偶尔会接到把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、希望四、浅谈字符编码能帮助你理解字符编码,知道为什么会有这种字符编码出现以及它的优缺点。
好了,暂时到这里吧,欢迎留言讨论。

  • 13
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值