近日帮一个老师做了个针对文本的统计分析的项目,我主要负责把文本数据爬取下来并进行基本处理。其实在这个项目之前,我在学习文本挖掘的时候就意识到了编码问题的麻烦......而之前一直没有重视这个问题,这次趁着这个机会,来总结一下我遇到的编码问题。这里大家要注意,Python3据说在编码上表现好多了,但是毕竟用了这么久Python2,而且为了了解下编码知识,这里还是要总结的。
1. # -*- coding: utf-8 -*-
如果要在python2的py文件里面写中文,则必须要添加一行声明文件编码的注释,否则python2会默认使用ASCII编码,而需要知道的是,python3已经默认是utf-8编码了(我准备转python3了...)
2.来看一个有趣的东西:
#! /usr/bin/env python
# -*- coding: utf-8 -*- a = ['你是真的皮', '今晚吃鸡'] b = [u'你是真的皮', u'今晚学习'] print a print b print a[0] print b[0]
你猜会输出什么?? 我们来看看:
['\xe4\xbd\xa0\xe6\x98\xaf\xe7\x9c\x9f\xe7\x9a\x84\xe7\x9a\xae', '\xe4\xbb\x8a\xe6\x99\x9a\xe5\x90\x83\xe9\xb8\xa1']
[u'\u4f60\u662f\u771f\u7684\u76ae', u'\u4eca\u665a\u5b66\u4e60'] 你是真的皮 你是真的皮
第一个问题:为什么打印一个元素就可以显示中文,打印列表就要以某种编码显示?
第二个问题:a,b中文相同为什么用列表打印出来编码不同?
3.遇到最多的问题:
先来看看这三行代码
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
这个东西可谓是解决编码问题的杀手锏,基本上来说当你遇到下面这句话的时候
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)
只要用上面三行代码就搞定了。为什么呢???