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 cookbook(数据结构与算法)从字典中提取子集的方法示例
Mar 22 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
May 15 Python
把csv文件转化为数组及数组的切片方法
Jul 04 Python
python通过txt文件批量安装依赖包的实现步骤
Aug 13 Python
python openvc 裁剪、剪切图片 提取图片的行和列
Sep 19 Python
python银行系统实现源码
Oct 25 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
Jan 04 Python
Pycharm中Python环境配置常见问题解析
Jan 16 Python
Python基于class()实现面向对象原理详解
Mar 26 Python
python 实现压缩和解压缩的示例
Sep 22 Python
python 实现波浪滤镜特效
Dec 02 Python
pandas 数据类型转换的实现
Dec 29 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限制页面只能在微信自带浏览器访问的代码
2014/01/15 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
2014/06/05 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
php计算年龄精准到年月日
2015/11/17 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
2015/12/14 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
js控制iframe的高度/宽度让其自适应内容
2014/04/09 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
浅谈JSON中stringify 函数、toJosn函数和parse函数
2015/01/26 Javascript
jquery实现图片随机排列的方法
2015/05/04 Javascript
JavaScript基础篇(6)之函数表达式闭包
2015/12/11 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
2015/12/28 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
DOM中事件处理概览与原理的全面解析
2016/08/16 Javascript
javascript实现二叉树遍历的代码
2017/06/08 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
VUE项目中加载已保存的笔记实例方法
2019/09/14 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
ES2020 已定稿,真实场景案例分析
2020/05/25 Javascript
Vue实现背景更换颜色操作
2020/07/17 Javascript
python为tornado添加recaptcha验证码功能
2014/02/26 Python
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
python dumps和loads区别详解
2020/02/04 Python
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
同程旅游英文网站:LY.com
2018/11/13 全球购物
什么是Rollback Segment
2013/04/22 面试题
shallow copy和deep copy的区别
2016/05/09 面试题
物业管理专业个人的自我评价
2013/11/19 职场文书
仓库理货员岗位职责
2013/12/18 职场文书
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
搞笑车尾标语
2014/06/23 职场文书
keepalived + nginx 实现高可用方案
2022/12/24 Servers