Python的编解码问题
对于使用Python来做数据科学的我,第一个遇到的困难就是Python2的编解码错误。由于项目上比较急,一直没有时间深入探索,只能先改用Python3解决。实际上,如果不弄清楚问题的本质,在Python3中还会出现另一些编解码问题。近期有时间,将这个问题好好地进行了梳理。
问题1:用python2.x运行的程序文件中有中文就出错
程序文件名chinese.py
print my_chinese
1
2
在终端输入命令python chinese.py,会出现如下错误提示:
错误提示
原因:
python是一种先编译后解释的语言,它在执行python xxx.py时,需要先对程序文件进行编译。编译器首先要读取文件,这时如果没有声明文件编码方式,编译器会使用默认的ASCII来对字节进行解码。这时,如果文件中包含非ASCII字符编码的字节,就会报错。
解决方案:
在程序文件chinese.py的第一行或第二行加入#coding:utf-8。其实,如果懂正则表达式的话,其实符合coding[:=]\s*([-\w.]+)都可以。
问题2:unicode编码解码错误
UnicodeEncodeError:
UnicodeEncodeError
UnicodeDecodeError:
UnicodeDecodeError
原因:
这个问题主要发生在程序的输入输出阶段,由自动的隐式转换造成。
输出前的数据是字符,需要把它编码为字节。如果没有对其以正确的方式编码,就会出现UnicodeEncodeError
输入前的数据是字节,需要把它解码为字符。如果没有对其以正确的方式解码,就会出现UnicodeDecodeError
对字节进行编码操作会产生UnicodeDecodeError;对字符进行解码操作会产生UnicodeEncodeError
解决方案:
输入之前和输出之后数据都是字节的形式,中间都是unicode。所以,主要弄清楚数据在输入输出阶段的情况:
数据是字节还是字符。字节通过解码变成字符,字符通过编码编程字节。
输入前数据是什么编码格式,所采用的方法使用什么解码方式,保证方法能够正确解码。
输出时需要什么样的编码格式,所采用的方法使用什么编码方式,保证能正确编码。
举例:
- 解码错误
一般要读的文件都是以某种方式编码的字节,如utf-8,我们要弄清楚我们读文件的方法(如open)采用什么方式进行解码,如果不是utf-8,则会出现UnicodeDecodeError错误。
- 编码错误
如果输入的数据是unicode字符,但其中包含非ASCII字符,就不能采用ASCII编码方法进行编码。如果用了,就会出现UnicodeEncodeError错误。应该采用utf-8等方式编码
总之,出现编解码错误的本质就是上面描述的内容,只要找到的发生问题的点,然后弄这个点做了什么,一切编解码问题就迎刃而解。
编解码问题涉及到一些背景知识,看这篇文章前建议先去了解一下。