Python 文本挖掘:解决Python中文编码问题

转于:http://rzcoding.blog.163.com/blog/static/2222810172013101785738166/

 
据说Python 最恶心的地方是中文编码问题,这也让很多人放弃使用Python。此刻我只想说。。放弃得好!。。

因为这确实是Python 最恶心的问题,暂时木有之一。
在经过多次挫败,多次google,多次stackoverflow 无果之后,只有硬着头皮上。。因为只会用Python 了摔!
终于我总结出的一套可以解决中文编码问题的方法。额,这只是针对文本处理的,至于解析网页那些神奇的编码表示完全无力。

原理
第一:声明程序的编码类型为utf-8

#! /usr/bin/env python2.7
#coding=utf-8

# 在所有程序开头都声明使用的Python 版本和编码

 
第二:编码和解码的逻辑

1. Python 编译器能循环处理的编码只有unicode ,其它编码都是邪魔外道,都要通通被烧死的。。。(其它编码其实也是可以处理的,但要循环遍历每一个字符的时候只能处理unicode)

2. 这样一来就简单了,只要在处理任何编码之前,把这个编码转成unicode,就可以被Python 处理了。在输出到文本中时,再从unicode 编码回去就可以了。
3. 因此解码的时候就用decode,把utf-8 编码解码成unicode;编码的时候就用encode,把unicode 编码回utf-8。具体如下:

sometext.decode("utf8")# 成为一个unicode编码

sometext.encode("utf8")# 重新编码成utf-8编码

str(sometext) # 用str()函数也可把unicode编码为utf-8,因为一开始已经声明了编码类型为utf-8

 
第三:善用type() 函数来查看字符的编码

#! /usr/bin/env python2.7

#coding=utf-8

token =",.!?:;"

print type(token)

>><type 'str'>
print type(token.decode('utf-8'))

>><type 'unicode'>

由于在开头声明了所有字符串类型的编码都为utf-8,所以“<type 'str'>”的意思是该字符是字符串类型,所以编码为utf-8。而它在decode 之后可以看出它已经成为unicode 编码了。

 
最后:为什么要一定要是unicode 和 utf-8编码啊,其它不行吗?
因为,这是Python 的原则啊。“只给你一种选择,其它,No~”(翻译肯定有误,不过意思就是这样的。。)
而且utf-8 比什么gb2312 这样吧编码看起来舒服多了。。。
 
实战
1. 要循环处理字符串的时候需要解码。例子如下:

#! /usr/bin/env python2.7
#coding=utf-8

token =",。!?:;"

for t in token:
print t

>>UnicodeDecodeError:'ascii' codec can't decode byte balabala in position balabala : ordinal not in range

for t in token.decode('utf-8'):
print t,

>> , 。 ! ? : ;

把字符串类型的token 解码为unicode 之后,就可以被循环遍历了。

 
2. 字符匹配的时候需要解码。因为当编码不一致的时候,就无法进行匹配。例子如下:

#! /usr/bin/env python2.7
#coding=utf-8

token =",。!?:;".decode("utf8")

string_list =['我','是','一只','大','苹果',',','又','香','又','甜','又','好吃','。']

for t in token:

for sl in string_list:

if t == sl:#无法匹配,因为一个是unicode编码,一个是utf-8编码

print t,

>>

for t in token:

for sl in string_list:

if t == sl.decode("utf8") #这时两个都是unicode编码了,可以匹配了

print t,

>> , 。

由于string_list 里面都是utf-8编码的元素,因此在匹配的时候需要解码成unicode 才能和已经解码的token 匹配。

 
3. 结合jieba 分词来把一个字符串分词并去除标点符号(这是去停用词的其中一部分),例子如下:
① jieba 分词之后添加到一个空列表里面,得到一个分词后的结果。可以看到jieba 分词之后词语成了unicode 编码。

#! /usr/bin/env python2.7
#coding=utf-8

import jieba

string ="我是一只大苹果,又香又甜又好吃。"

string_list =[]
seg = jieba.cut(string)
for word in seg:
string_list.append(word)
print string_list

>>[u'\u6211', u'\u662f', u'\u4e00\u53ea', u'\u5927', u'\u82f9\u679c', u'\uff0c', u'\u53c8', u'\u9999', u'\u53c8', u'\u751c', u'\u53c8', u'\u597d\u5403', u'\u3002']

② 去掉标点符号

#! /usr/bin/env python2.7
#coding=utf-8

import jieba

string ="我是一只大苹果,又香又甜又好吃。"

string_list =[]
seg = jieba.cut(string)
for i in seg:
string_list.append(i)

token =",。!?:;".decode('utf-8')

filer_seg =[fil for fil in seg if fil notin token]# 用Python的列表推导来去掉标点,形成一个去掉标点后的数组

for word in filter_seg:

print word,

>> 我 是 一只 大 苹果 又 香 又 甜 又 好吃

 
4. 读取txt 文件和存储成txt 文件的时候需要注意的编码问题。
① txt 文件存储时记得另存为utf-8 编码,要不读取它的时候。。呵呵。。坐等抓狂
txt 文件默认编码是ascii,因此在保存txt 文件的时候需要另存为utf-8。

这样读取文件的内容就是utf-8编码的了。

 
② 在把列表内容存储回txt 文件,就需要把Python 里面的unicode 编码为utf-8编码,这才能在txt 文件中显示出来。
把unicode 编码成utf-8,不一定要用encode,用str() 函数也可以了。

#! /usr/bin/env python2.7
#coding=utf-8

import jieba

string ="我是一只大苹果,又香又甜又好吃。"

string_list =[]
seg = jieba.cut(string)
for i in seg:
string_list.append(i)

f = open('D:/code/example.txt','w')
for word in string_list:
f.write(str(word)+' ')#用str()函数把unicode字符编码为utf-8,并写入txt 文件中
f.close()

基本上文本挖掘中需要用到的编码解码内容都在里面了,如果还有其它情况,就按照原理办事,一切都好。

转:解决Python中文编码问题的更多相关文章

  1. 解决python中文编码错误问题

    对于初学者而言,编码问题或许还没有没重视起来,但是编码问题是中文开发者必须面对的.今天来看下python开发中如何解决编码问题.注意:本篇讲的是最常见的一种编码问题,其他编码问题,如json函数引起的 ...

  2. paip.日志中文编码原理问题本质解决python

    paip.日志中文编码原理问题本质解决python 默认的python日志编码仅仅gbk...保存utf8字符错误..输出到个eric5的控制台十默认好像十unicode的,要是有没显示出来的字符,大 ...

  3. [Python] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题

    最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下 ...

  4. python中文编码问题深入分析(一):字符编码基础

    背景:笔者作为一名刚接触python语言的新手,在实际的项目中,遇到过一些中文编码问题,初次遇到这些问题的时候,刚开始显得有些手足无措,也不知从何查起.常言道:有问题,找度娘!当我打开www.baid ...

  5. python - 中文编码/ASCII

    Python 中文编码 为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5.    GB2312(1980年)一共收录了7445个字符,包括6763个汉子和682个其他符号. ...

  6. Python中文编码问题(字符串前面加'u')

    中文编码问题是用中文的程序员经常头大的问题,在python下也是如此,那么应该怎么理解和解决python的编码问题呢? 我们要知道python内部使用的是unicode编码,而外部却要面对千奇百怪的各 ...

  7. python中文编码 - python基础入门(5)

    python到目前为止,一共有两个版本,分别是2.x和3.x版本,根据官方正式通知2020年停止对python更新和维护,距离今天还有110天左右,所以正在学习python的小伙伴应该暗中庆幸一波. ...

  8. (原)怎样解决python dataframe loc,iloc循环处理速度很慢的问题

    怎样解决python dataframe loc,iloc循环处理速度很慢的问题 1.问题说明 最近用DataFrame做大数据 处理,发现处理速度特别慢,追究原因,发现是循环处理时,loc,iloc ...

  9. 解决 python 读取文件乱码问题(UnicodeDecodeError)

    解决 python 读取文件乱码问题(UnicodeDecodeError) 确定你的文件的编码,下面的代码将以'utf-8'为例,否则会忽略编码错误导致输出乱码 解决方案一 with open(r' ...

随机推荐

  1. Angular ng-include 学习实例

    ng-include 可以引入外部的文件到当前视图中.这样可以增强复用性. 最简单的用法  <div ng-include src="'/public/template/tpl.htm ...

  2. VIN码识别/车架号识别独家支持云识别

    VIN码(车架号)对于懂车的人来说并不陌生,不要小看这一串字符,从VIN码中可以读懂车辆的生产厂家.年代.车型.车身型式及代码.发动机代码及组装地点等信息. 一辆汽车的VIN码也是车辆的唯一身份证明, ...

  3. 4.1 所有类型都从 System.Object 派生

    "运行时"要求各个类型最终都从 System.Object 派生.(显示继承/隐式继承) 提供公共方法(public): Equals 判断两个对象相等,true 表示相等. Ge ...

  4. 关于SQL 语句常用的一些查询收藏

    create database xuesheng go use xuesheng go /*学生表*/ create table Student ( S# ,) primary key, Sname ...

  5. 使用 Mesos 管理虚拟机

    摘要 为了满足渲染.基因测序等计算密集型服务的需求,UCloud 推出了“计算工厂”产品,让用户可以快速创建大量的计算资源(虚拟机).该产品的背后,是一套基于 Mesos 的计算资源管理系统.本文简要 ...

  6. 根据Unicode码生成汉字

    最近需要一批汉字字符数据,类似数字字符与ASCII码之间的对应关系,汉字字符与Unicode码之间也存在对应关系. 所以可以遍历Unicode码批量生成汉字. 其中,汉字为宽字符,输出时候注意需要修改 ...

  7. 《Linux内核分析》学习总结与学习心得

    一.目录列表 第一周:计算机是如何工作的? http://www.cnblogs.com/dvew/p/5224866.html 第二周:操作系统是如何工作的? http://www.cnblogs. ...

  8. Python 变量和常量及数据类型

    一.变量的命名 变量由字母.数字和下划线组成.变量的第1个字符必须是字母或下划线. 二.变量的赋值 例: x = 1 三.局部变量 局部变量只能在函数或者代码段内使用. 四.全局变量 在函数之外定义的 ...

  9. lintcode-507-摆动排序 II

    507-摆动排序 II 给你一个数组nums,将它重排列如下形式 nums[0] < nums[1] > nums[2] < nums[3].... 注意事项 你可以认为每个输入都有 ...

  10. lintcode-206-区间求和 I

    206-区间求和 I 给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表.每一个查询列表有两个整数 [start, end] . 对于每个查询,计算出数组中从下标 ...