简单解决Python文件中文编码问题


Posted in Python onNovember 22, 2015

读写中文

需要读取utf-8编码的中文文件,先利用sublime text软件将它改成无DOM的编码,然后用以下代码:

with codecs.open(note_path, 'r+','utf-8') as f:
line=f.readline()
print line

这样就可以正确地读出文件里面的中文字符了。

同样的,如果要在创建的文件中写入中文,最好也和上面差不多:

with codecs.open(st,'a+','utf-8') as book_note:
book_note.write(st)

创建中文文件

然后以读出的字符为文件名,创建文件。

如果直接用上面读出来的字符串创建文件,则会出现:

st=digest_path+"\\"+onenote[0]+".txt"
print st
with open(st,'a+') as book_note:

简单解决Python文件中文编码问题

经过调试,应该是最后一个换行符的问题,在生成名字的时候,将字符trip一下,就能够得到文件:

st=digest_path+"\\"+onenote[0].strip()+".txt"

中文编码问题是用中文的程序员经常头大的问题,在python下也是如此,那么应该怎么理解和解决python的编码问题呢?

我们要知道python内部使用的是unicode编码,而外部却要面对千奇百怪的各种编码,比如作为中国程序经常要面对的gbk,gb2312,utf8等,那这些编码是怎么转换成内部的unicode呢?

首先我们先看一下源代码文件中使用字符串的情况。源代码文件作为文本文件就必然是以某种编码形式存储代码的,python默认会认为源代码文件是asci编码,比如说代码中有一个变量赋值:

s1='a' 
print s1

python认为这个'a'就是一个asci编码的字符。在仅仅使用英文字符的情况下一切正常,但是如果用了中文,比如:

s1='哈' 
print s1

这个代码文件被执行时就会出错,就是编码出了问题。python默认将代码文件内容当作asci编码处理,但asci编码中不存在中文,因此抛出异常。

解决问题之道就是要让python知道文件中使用的是什么编码形式,对于中文,可以用的常见编码有utf-8,gbk和gb2312等。只需在代码文件的最前端添加如下:

# -*- coding: utf-8 -*-

这就是告知python我这个文件里的文本是用utf-8编码的,这样,python就会依照utf-8的编码形式解读其中的字符,然后转换成unicode编码内部处理使用。

不过,如果你在Windows控制台下运行此代码的话,虽然程序是执行了,但屏幕上打印出的却不是哈字。这是由于python编码与控制台编码的不一致造成的。Windows下控制台中的编码使用的

是gbk,而在代码中使用的utf-8,python按照utf-8编码打印到gbk编码的控制台下自然就会不一致而不能打印出正确的汉字。

解决办法一个是将源代码的编码也改成gbk,也就是代码第一行改成:

# -*- coding: gbk -*-

另一种方法是保持源码文件的utf-8不变,而是在'哈'前面加个u字,也就是:

s1=u'哈' 
print s1

这样就可以正确打印出'哈'字了。

这里的这个u表示将后面跟的字符串以unicode格式存储。python会根据代码第一行标称的utf-8编码识别代码中的汉字'哈',然后转换成unicode对象。如果我们用type查看一下'哈'的数据类型type(‘哈'),会得到<type ‘str'>,而type(u'哈'),则会得到<type ‘unicode'>,也就是在字符前面加u就表明这是一个unicode对象,这个字会以unicode格式存在于内存中,而如果不加u,表明这仅仅是一个使用某种编码的字符串,编码格式取决于python对源码文件编码的识别,这里就是utf-8。

Python在向控制台输出unicode对象的时候会自动根据输出环境的编码进行转换,但如果输出的不是unicode对象而是普通字符串,则会直接按照字符串的编码输出字符串,从而出现上面的现象。

使用unicode对象的话,除了这样使用u标记,还可以使用unicode类以及字符串的encode和decode方法。

unicode类的构造函数接受一个字符串参数和一个编码参数,将字符串封装为一个unicode,比如在这里,由于我们用的是utf-8编码,所以unicode中的编码参数使用'utf-8′将字符封装为

unicode对象,然后正确输出到控制台:

s1=unicode(‘哈', ‘utf-8′) 
print s1

另外,用decode函数也可以将一个普通字符串转换为unicode对象。很多人都搞不明白python字符串的decode和encode函数都是什么意思。这里简要说明一下。

decode是将普通字符串按照参数中的编码格式进行解析,然后生成对应的unicode对象,比如在这里我们代码用的是utf-8,那么把一个字符串转换为unicode就是如下形式:

s2='哈'.decode(‘utf-8′)

这时,s2就是一个存储了'哈'字的unicode对象,其实就和unicode(‘哈', ‘utf-8′)以及u'哈'是相同的。

那么encode正好就是相反的功能,是将一个unicode对象转换为参数中编码格式的普通字符,比如下面代码:

s3=unicode(‘哈', ‘utf-8′).encode(‘utf-8′)

s3现在又变回了utf-8的'哈'。

Python 相关文章推荐
Python时间戳与时间字符串互相转换实例代码
Nov 28 Python
Python数组条件过滤filter函数使用示例
Jul 22 Python
Python中用于返回绝对值的abs()方法
May 14 Python
Python中max函数用法实例分析
Jul 17 Python
Python中内置的日志模块logging用法详解
Jul 12 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
Apr 18 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 Python
python实现12306登录并保存cookie的方法示例
Dec 17 Python
opencv 图像腐蚀和图像膨胀的实现
Jul 07 Python
Python之京东商品秒杀的实现示例
Jan 06 Python
pytorch finetuning 自己的图片进行训练操作
Jun 05 Python
Python制作简单的网页爬虫
Nov 22 #Python
Python编程中使用Pillow来处理图像的基础教程
Nov 20 #Python
在Mac OS系统上安装Python的Pillow库的教程
Nov 20 #Python
详解Python编程中time模块的使用
Nov 20 #Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
Nov 20 #Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 #Python
Python聚类算法之DBSACN实例分析
Nov 20 #Python
You might like
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
5个最佳的Javascript日期处理类库分享
2012/04/15 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
2015/11/26 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
bootstrap与Jquery UI 按钮样式冲突的解决办法
2016/09/23 Javascript
Bootstrap3 图片(响应式图片&amp;图片形状)
2017/01/04 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
js中字符型和数值型数字的互相转化方法(必看)
2017/04/25 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
小程序开发基础之view视图容器
2018/08/21 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
仿照Element-ui实现一个简易的$message方法
2020/09/14 Javascript
vue中解决微信html5原生ios虚拟键返回不刷新问题
2020/10/20 Javascript
[40:27]完美世界DOTA2联赛PWL S3 PXG vs GXR 第一场 12.19
2020/12/24 DOTA
Python转码问题的解决方法
2008/10/07 Python
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
pygame学习笔记(3):运动速率、时间、事件、文字
2015/04/15 Python
Python3使用requests登录人人影视网站的方法
2016/05/11 Python
python批量赋值操作实例
2018/10/22 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
使用Pyhton 分析酒店针孔摄像头
2020/03/04 Python
python os模块常用的29种方法使用详解
2020/06/02 Python
matplotlib.pyplot.plot()参数使用详解
2020/07/28 Python
CSS3+js实现简单的时钟特效
2015/03/18 HTML / CSS
学雷锋志愿服务月活动总结
2014/03/09 职场文书
租房协议书
2014/09/12 职场文书
群众路线批评与自我批评发言稿
2014/10/16 职场文书
单位作风建设自查报告
2014/10/23 职场文书
初中思想品德教学反思
2016/02/24 职场文书
Javascript使用integrity属性进行安全验证
2021/11/07 Javascript
科学家测试在太空中培育人造肉,用于未来太空旅行
2022/04/29 数码科技