Python 2.7 学习笔记 中文处理
首先我们在编写python代码文件时,文件本身会采用一种编码格式,如 utf-8 或 gbk
这时我们需要在python文件的开头设置文件的编码格式,以告诉编译器。
如果文件的编码格式是 utf-8, 则在文件的第一行需要添加如下语句
#coding=utf-8
如果文件的编码格式是 gbk, 则在文件的第一行需要添加如下语句
#coding=gbk
如果设置为utf-8的格式,在linux执行,中文处理,包括显示没任何问题。
但是如果设置为utf-8的格式,在window下,在命令行下执行时,发现利用 print打印中文会出现乱码。
原因是因为,虽然文件声明为utf-8,且用utf-8的编码保存的源文件。但是windows的本地默认编码是cp936,也就是gbk编码,所以在控制台直接打印utf-8的字符串就显示乱码了。 注意,实际上只是显示有问题,入库等处理并没问题。
这有两种解决方案。
一、方案一:
将文件的编码格式改为gbk,并在文件的第一行改为#coding=gbk,这时处理中文就没问题。
但这个方案带来的问题,如果该文件放到Linux下可能会显示出问题。因为一般linux机器下没有gbk的字符集。
二、方案二
文件还是采用utf-8的编码,文件头的第一行依然是#coding=utf-8
这时在print 中文时需要进行下编码,代码如:
print "中文".decode('utf-8').encode(sys.getfilesystemencoding())
注意:因为用到了sys模块,需要在语句执行添加 import sys
这样带来的问题,print语句比较臃肿,可以考虑自己封装下.
三、关于 decode 方法和 encode 方法
字符串在Python内部的表示是unicode编码。在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
decode的作用是将其他编码的字符串转换成unicode编码, 其参数就是字符串的当前编码格式。如str.decode('utf-8'),表示将utf-8编码的字符串转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串, 其参数就是希望转换后的编码格式。如str.encode('utf-8'),表示将unicode编码的字符串转换成utf-8编码。
不能直接将一种编码(非unicode)的字符串利用encode方法直接转换为其它的编码格式。
注意:unicode 和 其它的编码字符串在python 是完全不同的两种数据类型,unicode的字符串时unicode类型的, 其它的是str类型。
在python中,对于字面字符串我们可以在字面字符串前加u把该字符串声明为unicode类型的。
下面我们来看一个例子了解unicode和str类型的区别
>>> s='测试'
>>> us=u'测试unicode'
>>> print isinstance(s,str)
True
>>> print isinstance(s,unicode)
False
>>> print isinstance(us,str)
False
>>> print isinstance(us,unicode)
True
>>> print isinstance(us.encode('utf-8'),unicode)
False
>>> print isinstance(us.encode('utf-8'),str)
True
>>> print isinstance(s.decode('gbk'),unicode) #是在windows下执行,默认的s是gbk编码
True
利用第三方包 chardet的detect方法可以检查一个字符串具体的编码格式,如:
>>> import chardet
>>> chardet.detect('中文')
{'confidence': 0.682639754276994, 'encoding': 'KOI8-R'} #在window下执行的
>>> chardet.detect('str123')
{'confidence': 1.0, 'encoding': 'ascii'}
>>> chardet.detect(u'中文') #无法对unicode类型进行检查
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Anaconda2\lib\site-packages\chardet\__init__.py", line 25, in de
raise ValueError('Expected a bytes object, not a unicode object')
ValueError: Expected a bytes object, not a unicode object
>>> chardet.detect(u'中文'.encode('utf8')) #参数为utf-8的
{'confidence': 0.7525, 'encoding': 'utf-8'}
四、与中文相关的常见处理场景
在程序编写中,一般涉及到中文我们才需要编解码。 通常有如下几种场景:
1、将文件中硬编码的中文字符串利用print输出,就如上面介绍的例子:
str = "中文"
print str
str = str.decode('utf-8').encode(sys.getfilesystemencoding())
print str
上面的代码假设文件的编码格式为utf-8,当在windows命令行下执行时,第一个print语句输出的是乱码。
我们先调用decode方法将其转为 unicode编码,然后在调用encode方法转为系统编码的格式。
2、当我们用raw_input从控制台获取字符串时
这时获取到的字符串的编码时系统编码,不一定是utf-8,这时我们想要转为utf-8,可以用如下的方法
msg = raw_input(">")
msg = msg.decode(sys.getfilesystemencoding()).encode('utf-8')
上面代码先将字符串解码成unicode编码,再编码成utf-8
3、列表或字典中的中文处理
data = {"a":"hello","b":"中国"} #假设是utf-8的格式
这时我们用print直接输出data, 或用str函数将data转为字符串。其中的中文是变成unicode的字符,如:
>>> data = {"a":"hello","b":"中国"}
>>> print data
{'a': 'hello', 'b': '\xd6\xd0\xb9\xfa'}
单独输出中文字段没问题,如
>>> print data['b']
中国
如果希望能正常的将整个字典输出,可以利用json包的dump方法,如:
>>> data = {"a":"hello","b":"中国"}
>>> s = json.dumps(data,ensure_ascii=False);
>>> print s
{"a": "hello", "b": "中国"}
>>> print isinstance(s,str)
True
4、当我们利用os的相关方法时,传入的字符串编码需要与系统一致,如:
filename = "D:/测试.txt"; # 假设是utf-8的格式
filename = filename.decode("utf-8").encode(sys.getfilesystemencoding()); #转为当前系统字符集
re = os.path.exists(filename) # 检查文件是否存在,必须要上面的先转换为当前系统字符集才会正确
filename = filename.decode(sys.getfilesystemencoding()).encode("utf-8"); #重新转为utf-8
Python 2.7 学习笔记 中文处理的更多相关文章
- Requests:Python HTTP Module学习笔记(一)(转)
Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...
- python网络爬虫学习笔记
python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...
- Python Built-in Function 学习笔记
Python Built-in Function 学习笔记 1. 匿名函数 1.1 什么是匿名函数 python允许使用lambda来创建一个匿名函数,匿名是因为他不需要以标准的方式来声明,比如def ...
- python数据分析入门学习笔记
学习利用python进行数据分析的笔记&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我一边学习一边完善~ 前言:各种和数据分 ...
- python数据分析入门学习笔记儿
学习利用python进行数据分析的笔记儿&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我一边学习一边完善~ 前言:各种和数据 ...
- Python快速入门学习笔记(二)
注:本学习笔记参考了廖雪峰老师的Python学习教程,教程地址为:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb49318210 ...
- python网络爬虫学习笔记(二)BeautifulSoup库
Beautiful Soup库也称为beautiful4库.bs4库,它可用于解析HTML/XML,并将所有文件.字符串转换为'utf-8'编码.HTML/XML文档是与“标签树一一对应的.具体地说, ...
- Python之xml学习笔记
XML处理模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,至今很多传统公司如金融行业的很多系统的接口还主要是xml. xml的格式如下,就是通过&l ...
- python网络爬虫学习笔记(一)Request库
一.Requests库的基本说明 引入Rquests库的代码如下 import requests 库中支持REQUEST, GET, HEAD, POST, PUT, PATCH, DELETE共7个 ...
随机推荐
- 删除input或textarea输入框在移动版显示的阴影(Safari/iPhone)
移动端浏览网页元素时,自动给input和textarea添加了内部阴影的效果,只需加入样式即可去除 input,textarea{-webkit-appearance: none;} input[ty ...
- WebRTC学习笔记_Demo收集
1. WebRTC学习 1.1 WebRTC现状 本人最早接触WebRTC是在2011年底,那时Google已经在Android源代码中增加了webrtc源代码,放在/external/w ...
- java设计模式(二)单例模式 建造者模式
(三)单例模式 单例模式应该是最常见的设计模式,作用是保证在JVM中,该对象仅仅有一个实例存在. 长处:1.降低某些创建比較频繁的或者比較大型的对象的系统开销. 2.省去了new操作符,减少系统内存使 ...
- 阿里云Ubuntu部署java web(2) - 配置tomcat
系统版本号:Ubuntu12.04 64位 安装: 首先要安装java(測试时使用的版本号是6b27-1.12.6-1ubuntu0.12.04.2).版本号可自行选择,但不同版本号配置方法可能不同. ...
- 通达OA 小飞鱼开发培训第四讲 工作流介绍(图文)
本次课程主要解说了OA工作流相关内容,有些涉及到工作流的程序开发假设对工作流不熟悉也是有非常大难度,因此在这里进行了内容补充. 1.工作流介绍
- SSIS DB目录设置 (Integration Services Catalogs)
1.创建SSISDB目录 这里没什么好说的,点击Enable CLR Integration ,然后设置一个加密密码 2. SSIS Catalog设置 Retention Period (days) ...
- HOOK API(四)—— 进程防终止
HOOK API(四) —— 进程防终止 0x00 前言 这算是一个实战吧,做的一个应用需要实现进程的防终止保护,查了相关资料后决定用HOOK API的方式实现.起初学习HOOK API ...
- VS的工程宏,比如$(SolutionDir) 的含义及查找
Configuration->General->Output Directory->单击编辑框点下拉箭头-> <Edit...> 图1 图2
- kinect for windows - SkeletonBasics-D2D详解之一
之前的文章介绍了深度图的获取,但是深度图只是提供了一些数据,这些数据给上层应用使用还是偏底层一些,我们希望在这个基础上,获取一些信息,比如手挥动,人跑步,或者运动等等,那么这个文章开始我们来讲述kin ...
- VC获取精确时间的做法
声明:本文章是我整合网上的资料而成的,其中的大部分文字不是我所为的,我所起的作用只是归纳整理并添加我的一些看法.非常感谢引用到的文字的作者的辛勤劳动,所参考的文献在文章最后我已一一列出. 对关注性能的 ...