PythonTip >> 博文 >> iteye

Python中读取文件时报错UnicodeDecodeError

zihua 2013-09-30 16:09:05 点击: 1129 | 收藏


最近想学习数据挖掘,便入门python,在读取文件的时候遇到了UnicodeDecodeError。在此想将自己解决问题的思路再理一遍。
操作系统:win7
python版本:3.3.2
读取的文本文件:shediao.txt--------------这是文件1
代码:----------------这是代码A
f=open("D://shediao.txt")
print(f.read())

在cmd中运行cdtext.py的结果:

为了解决这个问题,首先了解一下Python的读写文件方法:
open()方法一般返回一个file文件对象
例子:
f=open(file,mode='r',encoding=None)

open()方法里的参数还有其他,一定要用户设定的只有文件路径。在这里我们讨论一下mode和encoding这两个参数。
第一个参数是string类型的文件地址,第二次参数代表文件被打开的模式。有以下几种模式:
‘r’:(read)文件只能被读(默认)
‘w’:(write)文件只能被写(如果写入一个已存在的文件中,原来的数据会被删除)
‘x’:创建新文件,如果文件原本存在则不创建
‘a’:(append)自动添加新内容到文件结尾
‘b’:(binary)二进制模式
‘t’:(text)文本模式(默认)
‘+’:读和写
‘U’:(universal newlines mode)通用换行模式
在windows系统中,text file和binary file是有区别的。对于JPEG和EXE格式文件,binary模式要谨慎使用。以binary模式打开文件,返回的是bytes对象;而以text模式打开文件,返回的是str对象。
默认模式是’r’,相当于’rt’。
在代码A中,选择了默认的模式,即’rt’模式。
在’t’模式下,当使用open()方法的时候,如果不设定参数encoding的值,该方法会默认encoding为系统默认的编码格式。p.s.获得系统默认的编码格式的方法如下:
import locale
print(locale.getpreferredencoding())

在我这个例子中,原文件的编码格式为ANSI,系统默认的编码格式为cp936,有些中文字符在两种编码格式下不统一,因此读文件时报错。
接下来,我利用记事本,把shediao.txt文件的编码格式改为utf-8,见图:



并且在open()方法中设定encoding为’utf-8’,代码如下:-------------这是代码B
f=open("D://shediao.utf-8.txt",encoding='utf-8')
print(f.read())

在shell中运算结果:

在python2.7.5中运行代码A是不会报错的,而且可以完整的把文本打印出来。
而且在python3.3.2中运行代码A,但改变读取的文件(文件还是使用ANSI编码格式的-------这是文件2),也可以把文本完整的打印出来。
更多的问题还有待研究。python2x和python3x对读取文件有什么不同?为什么文件2可以完整打印,而文件1不可以?(猜测:文件1中有特殊字符).........
参考资料:
python官网上关于读写文件的指导----->
http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files
python官网上关于编码格式------->
http://docs.python.org/3/library/codecs.html#module-codecs
text file 和binary file的区别--->
http://perfyy.blog.sohu.com/145845129.html
中文字符集编码---->
http://old.blog.edu.cn/user3/flyingcs/archives/2006/1418577.shtml

原文链接:http://monsterhuan.iteye.com/blog/1948945

作者:zihua | 分类: iteye | 标签: python Windows | 阅读: 1129 | 发布于: 2013-09-30 16时 |
上一篇:Python yield 使用浅析
下一篇: ws4py