Python中使用不同编码读写txt文件详解


Posted in Python onMay 28, 2015
import os

import codecs

filenames=os.listdir(os.getcwd())
out=file("name.txt","w")

for filename in filenames:

 out.write(filename.decode("gb2312").encode("utf-8"))

out.close()

将执行文件的当前目录及文件名写入到name.txt文件中,以utf-8格式保存
如果采用ANSI编码保存,用如下代码写入即可:

out.write(filename)

打开文件并写入

引用codecs模块,对该模块目前不了解。在此记录下方法,有空掌握该模块功能及用法。

import codecs

file=codecs.open("lol.txt","w","utf-8")

file.write(u"我")

file.close()

读取ANSI编码的文本文件和utf-8编码的文件

读取ANSI编码文件

建立一个文件test.txt,文件格式用ANSI,内容为:

abc中文

用python来读取

# coding=gbk

print open("Test.txt").read()

结果:abc中文
读取utf-8编码文件(无BOM)
把文件格式改成UTF-8:
结果:abc涓 ??

显然,这里需要解码:
# -*- coding: utf-8 -*-

import codecs

print open("Test.txt").read().decode("utf-8")

结果:abc中文

读取utf-8编码文件(有BOM)

某些软件在保存一个以UTF-8编码的文件时,默认会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。在有些软件可以控制是否插入BOM。如果在有BOM的情况下,在读取时需要自己去掉这些字符,python中的codecs module定义了这个常量:

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

import codecs

data = open("Test.txt").read()

if data[:3] == codecs.BOM_UTF8:

    data = data[3:]

print data.decode("utf-8")

结果:abc中文
在看下面的例子:

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

data = open("name_utf8.txt").read()

u=data.decode("utf-8")

print u[1:]

打开utf-8格式的文件并读取utf-8字符串后,解码变成unicode对象。但是会把附加的三个字符同样进行转换,变成一个unicode字符。该字符不能被打印。所以为了正常显示,采用u[1:]的方式,过滤到第一个字符。
注意:在处理unicode中文字符串的时候,必须首先对它调用encode函数,转换成其它编码输出。

设置python默认编码

import sys

reload(sys)

sys.setdefaultencoding("utf-8")

print sys.getdefaultencoding()

今天碰到了 python 编码问题, 报错信息如下

Traceback (most recent call last):

  File "ntpath.pyc", line 108, in join

UnicodeDecodeError: 'ascii' codec can't decode byte 0xa1 in position 36: ordinal not in range(128)

显然是当前的编码为ascii, 无法解析0xa1(十进制为161, 超过上限128). 进入python console后, 发现默认编码确实是 ascii, 验证过程为:
在python2.6中无法调用sys.setdefaultencoding()函数来修改默认编码,因为python在启动的时候会调用site.py文件,在这个文件中设置完默认编码后会删除sys的setdefaultencoding方法。不能再被调用了.  在确定sys已经导入的情况下, 可以reload sys这个模块之后, 再 sys.setdefaultencoding('utf8')

import sys

reload(sys)

sys.setdefaultencoding("utf-8")

print sys.getdefaultencoding()

确实有效, 根据 limodou 讲解,  site.py 是 python 解释器启动后, 默认加载的一个脚本. 如果使用 python -S 启动的话, 将不会自动加载 site.py.

上面写的挺??碌?

==================================
如何永久地将默认编码设置为utf-8呢?  有2种方法:
==================================

第一个方法<不推荐>: 编辑site.py, 修改setencoding()函数, 强制设置为 utf-8
第二个方法<推荐>: 增加一个名为 sitecustomize.py, 推荐存放的路径为 site-packages 目录下
sitecustomize.py 是在 site.py 被import 执行的, 因为 sys.setdefaultencoding() 是在 site.py 的最后删除的, 所以, 可以在 sitecustomize.py 使用 sys.setdefaultencoding().

import sys   

sys.setdefaultencoding('utf-8')

既然 sitecustomize.py 能被自动加载,  所以除了设置编码外, 也可以设置一些其他的东西
字符串的编码
s1='中文'

像上面那样直接输入的字符串是按照代码文件的编码来处理的,如果是unicode编码,有以下三种方式:
1 s1 = u'中文'

2 s2 = unicode('中文','gbk')

3 s3 = s1.decode('gbk')

unicode是一个内置函数,第二个参数指示源字符串的编码格式。
decode是任何字符串具有的方法,将字符串转换成unicode格式,参数指示源字符串的编码格式。
encode也是任何字符串具有的方法,将字符串转换成参数指定的格式。
Python 相关文章推荐
python通过floor函数舍弃小数位的方法
Mar 17 Python
探究python中open函数的使用
Mar 01 Python
详解python进行mp3格式判断
Dec 23 Python
python实现数据预处理之填充缺失值的示例
Dec 22 Python
神经网络(BP)算法Python实现及应用
Apr 16 Python
Python随机生成身份证号码及校验功能
Dec 04 Python
Python实现多进程的四种方式
Feb 22 Python
python numpy 常用随机数的产生方法的实现
Aug 21 Python
python实现连续变量最优分箱详解--CART算法
Nov 22 Python
python Canny边缘检测算法的实现
Apr 24 Python
python中tkinter窗口位置\坐标\大小等实现示例
Jul 09 Python
python 解决Windows平台上路径有空格的问题
Nov 10 Python
Python实现统计英文单词个数及字符串分割代码
May 28 #Python
python处理大数字的方法
May 27 #Python
python类继承用法实例分析
May 27 #Python
python显示生日是星期几的方法
May 27 #Python
python中zip和unzip数据的方法
May 27 #Python
Python pickle模块用法实例分析
May 27 #Python
Python创建模块及模块导入的方法
May 27 #Python
You might like
什么情况下可以不写PHP的闭合标签“?&gt;”
2014/08/28 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
PHP中单例模式与工厂模式详解
2017/02/17 PHP
老生常谈PHP面向对象之命令模式(必看篇)
2017/05/24 PHP
网页前台通过js非法字符过滤代码(骂人的话等等)
2010/05/26 Javascript
改写一个简单的菜单 弹性大小
2010/12/02 Javascript
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
AngularJS中的指令全面解析(必看)
2016/05/20 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
2017/07/03 Javascript
解决html input验证只能输入数字,不能输入其他的问题
2017/07/21 Javascript
JavaScript中一些特殊的字符运算
2017/08/17 Javascript
jquery+css实现下拉列表功能
2017/09/03 jQuery
对Vue table 动态表格td可编辑的方法详解
2018/08/28 Javascript
解决Layui当中的导航条动态添加后渲染失败的问题
2019/09/25 Javascript
简单实现节流函数和防抖函数过程解析
2019/10/08 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
JavaScript TAB栏切换效果的示例
2020/11/05 Javascript
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
Python合并字典键值并去除重复元素的实例
2016/12/18 Python
Python编程修改MP3文件名称的方法
2017/04/19 Python
对Python 多线程统计所有csv文件的行数方法详解
2019/02/12 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
详解python播放音频的三种方法
2019/09/23 Python
10分钟理解CSS3 FlexBox弹性布局
2018/12/20 HTML / CSS
美国乒乓球设备、配件和服装品牌:Killerspin
2020/06/07 全球购物
美工的岗位职责
2013/11/14 职场文书
大学生先进事迹材料
2014/02/16 职场文书
医德医风自我评价2015
2015/03/03 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
浅谈Redis存储数据类型及存取值方法
2021/05/08 Redis
pytorch 实现变分自动编码器的操作
2021/05/24 Python
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL