使用python2.x做中文的文本挖掘,遇到了几个坑,现总结如下:
1. 默认的defaultcoding:ascii
UnicodeDecodeError: ‘ascii’ codec can’t decode byte ……
如果遇到了上述错误,就应该好好检查一下python文件的编码格式了
python默认使用defaultencoding=ascii,若你没注意这一点直接以“utf-8”格式进行转换,将会报错
因此,建议编码的时候养成好习惯,切记一定要指定文件的编码格式
# -*- coding: utf-8 -*-
<div class="crayon-pre" style="font-size: 13px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="crayon-57b60e2fab98e616841284-1"><span class="crayon-k ">reload</span><span class="crayon-sy">(</span><span class="crayon-k ">sys</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="crayon-57b60e2fab98e616841284-2"><span class="crayon-k ">sys</span><span class="crayon-sy">.</span><span class="crayon-e">setdefaultencoding</span><span class="crayon-sy">(</span><span class="crayon-s">'utf-8'</span><span class="crayon-sy">)</span></div></div>
这里有2个作用:
1. 指定文本的编码格式为utf-8,这将影响到你定义的变量字符串(e.g. “test”)的编码
2. 指定编码函数 .encode()默认的decode()的编码为utf-8,因为
str.encode("utf-8") 等价于 str.decode(defaultencoding).encode("utf-8")<span style="font-size:14px;"><span class="crayon-sy"></span></span>
2. "test" 与 u"test" 的差别
python作为脚本语言,对变量类型没有强制约束,因此容易造成类型的混淆
s1 = "字符串"
s2 = u"字符串"
感觉上,2上述2种形式都是定义字符串,其实不然,第二种方式定义的是unicode对象。
str1 = "字符串" # 字符串,编码与文件声明的编码一致
str2 = u"字符串" # unicode对象
print type(str1)
print type(str2)
输出:
<type 'str'>
<type 'unicode'>
标准的unicode对象有2种定义方式:
s1 = u"字符串"
s2 = unicode("字符串", "utf-8")
unicode对象,可以和字符串进行转换:
# -*- coding:utf-8 -*-
str = "字符串" # 一个utf-8格式的字节串(与文件声明编码一致)
uObj = str.decode("utf-8") # str被解码为unicode对象,赋给uObj
str = uObj.encode("utf-8") # unicodeObj被编码为gbk格式的字节串
print str
输出:
<span style="font-size:14px;"><span style="font-size:14px;"></span></span><pre name="code" class="html">字符串