上一篇博客,我在爬虫的时候,已经提到了总遇到编码报错,UnicodeDecodeError, codec can’t , 这种类似的提示,导致程序无法继续下去。
于是,我开始仔细调研,查找资料,今天在这里总结下python中编码解码的情况,以及我遇到的一些坑,让大家以后少走弯路。
1.python环境下的编码
用python编程时,会遇到三个方面的编码:
(1)python程序文件的编码
(2)python开发环境的编码
(3)python读取写入文件、网页时,这些外部文件的编码
下面分别从python2、python3来说明以上编码
python2,在解决编码问题上,比较复杂;python3在2的基础上,优化了编码部分,在写程序时,使编码问题很简单就解决。
程序文件编码
指创建这个文件时的编码,比如python2创建时默认文件编码是ascii, 可以用一些编辑器如notpad txt
查看文件编码类型; 因此,想使用utf-8编码时,开头一般会加上#coding=utf-8
程序运行环境的编码
python2环境默认的是ascii编码, python3默认的是utf-8编码。
因此,python2写程序时,要加上运行环境要想使用utf-8的话, 一般要加上几句:
import sys
reload(sys)
sys.setdefaultencoding(‘**重点内容**utf-8’)
读取外部文件的编码
这个是比较复杂的部分。
首先要清楚你读取的外部文件是什么类型。
这个时候要用到 编码encode, 解码decode。
python2的编码解码:找一个统一的中间编码;
encode:将unicode编码转为其它类型的编码;
decode:将其它类型的编码转为unicode编码;可以通过这些转换方便之后程序的书写。
python3:python3默认的是utf-8编码, 并且python3把 字节流bytes, 字符串str分的很清楚,可以方便转换。
encode:将字符流转换为机器编码的字节流,全都是16进制;
decode:将16进制的字节流转换为人能识别的字符串。
python3因为,编码问题已经解决了很多,按照正常程序读取写入, 基本不会出现问题。
读取文件 open(, ,encoding=’utf-8’), 设置读进来的时候是什么格式。
我经常碰到的是文件里有特殊字符,读取到中间时,读不下去了,导致读取报错。 这时候我的解决办法是: open(’rb‘)按照字节流去读取,
可以保证能够读进来。 然后,python3 bytes 和str转换很方便, 转换成字符串就可以去做其它事情了。