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 相关文章推荐
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
Jan 05 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
Dec 12 Python
python调用java的jar包方法
Dec 15 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
Apr 18 Python
如何通过雪花算法用Python实现一个简单的发号器
Jul 03 Python
Python-Seaborn热图绘制的实现方法
Jul 15 Python
Django Rest framework频率原理与限制
Jul 26 Python
python字典的setdefault的巧妙用法
Aug 07 Python
Python帮你识破双11的套路
Nov 11 Python
如何通过Python3和ssl实现加密通信功能
May 09 Python
Python实现石头剪刀布游戏
Jan 20 Python
Pytorch中Softmax与LogSigmoid的对比分析
Jun 05 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
MVC模式的PHP实现
2006/10/09 PHP
PHP 多进程 解决难题
2009/06/22 PHP
php 文章采集正则代码
2009/12/28 PHP
解析php如何将日志写进syslog
2013/06/28 PHP
php 不使用js实现页面跳转
2014/02/11 PHP
PHP编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
fckeditor上传文件按日期存放及重命名方法
2015/05/22 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
2016/11/12 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
jquery判断当前浏览器的实现代码
2015/11/07 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
详解基于angular路由的requireJs按需加载js
2017/01/20 Javascript
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
jquery实现广告上下滚动效果
2021/03/04 jQuery
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
[00:52]DOTA2齐天大圣预告片
2016/08/13 DOTA
python文件特定行插入和替换实例详解
2017/07/12 Python
python实现将一维列表转换为多维列表(numpy+reshape)
2019/11/29 Python
加拿大领先的牛仔零售商:Bluenotes
2018/01/22 全球购物
实习护士自我鉴定
2013/10/13 职场文书
幼师自我鉴定
2014/02/01 职场文书
优秀女职工事迹材料
2014/02/06 职场文书
三查三看党性分析材料
2014/02/18 职场文书
学术会议主持词
2014/03/17 职场文书
花坛标语大全
2014/06/30 职场文书
初中中等生评语
2014/12/29 职场文书
幼儿学前班评语
2014/12/29 职场文书
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS