设为首页 收藏本站
查看: 802|回复: 0

[经验分享] Python中读取文件时报错UnicodeDecodeError

[复制链接]

尚未签到

发表于 2017-4-29 11:18:48 | 显示全部楼层 |阅读模式
最近想学习数据挖掘,便入门python,在读取文件的时候遇到了UnicodeDecodeError。在此想将自己解决问题的思路再理一遍。
操作系统:win7
python版本:3.3.2
读取的文本文件:shediao.txt--------------这是文件1
代码:----------------这是代码A

f=open("D://shediao.txt")
print(f.read())

在cmd中运行cdtext.py的结果:
DSC0000.jpg
为了解决这个问题,首先了解一下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,见图:
DSC0001.jpg
并且在open()方法中设定encoding为’utf-8’,代码如下:-------------这是代码B

f=open("D://shediao.utf-8.txt",encoding='utf-8')
print(f.read())

在shell中运算结果:
DSC0002.jpg
在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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-370722-1-1.html 上篇帖子: python编辑器——wingIDE的使用详解 下篇帖子: python学习,搭建web项目框架django
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表