python 读中文乱码_python字符乱码的解决小结
引言
无论学习什么程序语言,字符串这种数据类型总是着有非常重要。然而最近在学习python这门语言,想要显示中文,总是出现各种乱码。于是在网上查了很多资料,各说纷纭,我也尝试了许多的方法,有时候可以正常显示,有时候确实乱码,让我摸不着头脑。于是自己利用python读写中文的文本文件来尝试去摸索python中的中文编码问题。比较幸运的是,最后能够正常的读取出文本里面的中文数据并且显示,而且还能将中文的结果数据写入文本文件中。但是本文仅仅只是总结处理中文乱码问题的小结,并没有将其编码的原理弄透。那么,下面就让我们开始吧。
二、准备工作
1、首先得建立一个文本文件(编码方式是ascii),文本文件的内容如下:
编号,雨量,站点位置
1,10.2,南京
2,45,北京
3,78,上海
2、给这个文件文件的每一行建立一个数据层也就是建立储存记录的类
class Rain: def __init__(self,id,acc,site): self.id=id self.acc=acc self.site=site
三、错误及其改正
1、错误一
首先需要建立一个py文件去着手写我们的代码。创建我的py文件之后我还什么代码都没写,仅仅只是写了两行注释之后,保存一下,就发现下面的Console结果框就出来了错误。
代码截图如下:
原因分析:
原来Python的源代码默认的编码是ascii编码,而我的源代码文件中的注释含有中文,只是ascii编码所不能表达的字符,固然被python解释器解释的时候会出现如下错误。
解决方案:
只需要在文件的第一或者第二行,也只能是第一,第二行加上如下代码 :
#coding:utf-8
这行代码的意思是,让解释器用utf-8的方式去解释源代码文件。
2、错误二
建立好一个py文件之后就要读取文本里面的文件,代码如下:
f=open("raindata.txt","r") f.readline()#第一行是列,可以将文件移到第二行开始处 for line in f: print line
结果出现的结果中文都是乱码的,如下:
1��10.2���Ͼ�
2��45������
3��78���Ϻ�
原因:
因为txt文本文件中的中文都不是ascii编码,所以在读取出来的时候需要读取出来的字符串经过解码才能正常显示。
解决方案:
只需要在读取的文件后面进行解码就好了。代码如下:
f=open("raindata.txt","r") f.readline()#第一行是列,可以将文件移到第二行开始处 for line in f: print line.decode("gb2312")
结果如下:
1,10.2,南京
2,45,北京
3,78,上海
3、错误三
将数据正确读取出来之后就需要把每一行的数据存储到对象中。代码如下:
f=open("raindata.txt","r") f.readline()#第一行是列,可以将文件移到第二行开始处 for line in f: lines=line.decode("gb2312").split(",") obj=Rain(lines[0],lines[1],lines[2]) data.append(obj)
结果出现了split(",”)这个方法错误,提示说这个方法里面的参数不是中文编码。如下:
lines=line.decode("gb2312").split(",")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)
原因:
在网上看了这种错误的解决方案,说是因为我们的解决方案一种把py的源代码改为了utf-8的编码,所以可以解决该文件中所有的中文问题,但是调用的方法如何使其他模块中的方法,而方法还出现中文的话,就会提示错误。
解决方案:
既然知道了原因,那么解决的办法是,把整个环境的编码默认编码方式都改成utf-8就好了。更改的代码如下:
import sys default_encoding="utf-8" if(default_encoding!=sys.getdefaultencoding()): reload(sys) sys.setdefaultencoding(default_encoding) data =[] f=open("raindata.txt","r") f.readline()#第一行是列,可以将文件移到第二行开始处 for line in f: lines=line.decode("gb2312").split(",") obj=Rain(lines[0],lines[1],lines[2]) data.append(obj)
f.close() print len(data)
这样就解决了。
4、错误四
当把文本文件的编码方式换成了utf-8之后,上面的代码就出错了,错误如下:
Traceback (most recent call last):
File "D:programJavaPythonOnesrcTestFileHandle.py", line 24, in <module>
lines=line.decode("gb2312").split(",")
UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 3-4: illegal multibyte sequence
原因:
这是因为本来文件的编码是utf-8,所以用gb2312的编码方式去解码,无疑,那肯定是错误。然而前面已经设置了本系统默认的编码方式就是utf-8,所以只需要将读出来的文本去掉gb2312的编码方式就好了。代码如下:
import sys default_encoding="utf-8" if(default_encoding!=sys.getdefaultencoding()): reload(sys) sys.setdefaultencoding(default_encoding) data =[] f=open("raindata.txt","r") f.readline()#第一行是列,可以将文件移到第二行开始处 for line in f: lines=line.split(",") obj=Rain(lines[0],lines[1],lines[2]) data.append(obj) f.close()
这就解决了文本文件为utf-8的编码方式了。
5、错误五:
完成了读出文本数据的工作之后,接下就是将读入的数据写入文本文件的了。代码如下:
代码如下:
f1=open('result.txt','w') for vs in data: f1.write(vs.id+","+vs.acc+","+vs.site) f1.write("n")
这段写入数据的代码的分两种情况。
1、解释器的默认编码是utf-8的,而文本文件的编码也是utf-8的,直接写入,写入到txt的结果不会乱码。
2、而文本文件的编码也是ascii的,写入的时候需要编码之后再写入,更改的代码如下:
f1=open('result.txt','w') for vs in data: f1.write((vs.id+","+vs.acc+","+vs.site).encode("gb2312")) f1.write("n") fl.close()
到此为止,利用python进行读写文件的已经能够成功的运行的。然而,还补充一点,这是在打印列表中的中文时所照成的问题,并不是乱码的问题。
6、错误6
我们在打印含有中文的列表的时候中文得不到有效的输出,而是以utf-8的编码输出。代码如下:
strs=['你好','hello'] print strs
产生的结果如下:
['xe4xbdxa0xe5xa5xbd', 'hello']
解决方案:
把该列表一项一项的输出就没有问题。代码如下:
strs=['你好','hello'] print strs[0],sts[1]
结果为:
你好 hello
7、错误7
我编写python的脚本的编辑器为eclipse,在eclipse中的控制台中的输出结果(中文)是正确编码的,但是在cmd命令窗口中执行py脚本显示的确实乱码。打印代码如下:
print '等待连接'
然后我在cmd窗口中执行脚本的时输出的情况如下图:
出现了乱码。
解决方案:
要让这个字符串以utf-8的方式去实现,更改的代码如下图:
print u'等待连接'
这下不管是在eclipse的控制台中输出的,还是cmd命令窗口中输出都是正常显示。
四、总结
尝试过这么多错误之后终于正确的将文本的数据读取,也成功的数据写入到文本文件中。总结一下就那么几点。
- 源码中的编码方式
- 环境中的默认编码方式
- 结果文件中的编码方式
毕竟是初学python,对于上面的解决方案的解释的原理可能是错误的,希望各位大牛在看到错误的之后能及时指出来,在此感激不尽。
python 读中文乱码_python字符乱码的解决小结相关推荐
- bufferedreader读取中文乱码_python字符乱码的解决小结
引言 无论学习什么程序语言,字符串这种数据类型总是着有非常重要.然而最近在学习python这门语言,想要显示中文,总是出现各种乱码.于是在网上查了很多资料,各说纷纭,我也尝试了许多的方法,有时候可以正 ...
- python读中文文本_python读取中文txt文本
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- python中字符串输出乱码怎么解决_python字符乱码的解决小结
引言 无论学习什么程序语言,字符串这种数据类型总是着有非常重要.然而最近在学习python这门语言,想要显示中文,总是出现各种乱码.于是在网上查了很多资料,各说纷纭,我也尝试了许多的方法,有时候可以正 ...
- 在VS2017中用c#编写程序执行python遇到中文不能处理出现乱码的情况
最近在做在.NET平台调用python文件. 使用的工具为IronPython,VS2017 使用的语言为C#,python(2.7) 怎么使用请看这里 这篇文章主要是说下遇到的处理中文字符时出现乱码 ...
- python加中文注释_Python使用中文注释和输出中文(原创)
刚开始学习python,需要在Python中注释中文和输出中文,现在开始尝试: 仅为初步学习参考,高手请绕行. -------------------------------------------- ...
- 字符编码在python中的处理_python 字符编码处理问题总结
Python中常常遇到这种字符编码问题,尤其在处理网页源代码时(特别是爬虫中): UnicodeDecodeError: 'XXX' codec can't decode bytes in posit ...
- 永久解决python matplotlib 中文字体的显示乱码-Windows系统
在python中使用matplotlib绘图时,新手通常会遇到中文字体无法显示或显示乱码的问题,这是因为matplotlib中默认没有中文字体.windows系统下的永久解决方法如下: 1.确定当前p ...
- python读中文-python读写中文
广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. api api annotation json.dumps( ) 将py ...
- python支持中文吗_Python中使用中文
这个问题曾在我初学Python的时候令我头疼不已,尤其是目前我们因为各种包的原因还只能使用2.x的版本.在3.x中字符编码已经统一用Unicode了. Python 默认支持的是ASCII字符,包含了 ...
最新文章
- esl8266开发之旅_从ESL老师到越南软件开发人员的旅程
- android读取excel数据库,Android 读取Excel数据并保存在本地数据库
- JAVA try...catch...finally中的执行顺序和return语句
- MySQL基于ROW格式的数据恢复
- 中国毛纺织行业竞争分析与发展前景展望报告2022-2028年
- Idea如何方便的查看Java字节码文件,你是怎么做的
- 分享实录 | 单人开发场景下的测试环境实践
- 【Linux系统编程】fork()函数详解
- 机器学习——支持向量机SVMpython实现
- rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)
- node、npm、vue安装 -- VUE 项目 demo 实例
- 名校教授:把研究生扔到河里,游过去的就成为博士
- iview的select联动_render函数渲染的iview中的Select组件如何联动?
- 电脑怎么抠图换背景?如何把白底图片变成透明?
- 便携版的FeedDemon
- 【文印技巧】明明选了黑白打印,却印出了棕红色,怎么解决?
- python怎么更新sp2_GitHub - Sp2-Hybrid/Python-100-Days: Python - 100天从新手到大师
- 图像处理之颜色检测分类标记(Python OpenCV实现)
- vue js 清除 data数据
- 计算机操作员考评标准,计算机操作员职业技能鉴定标准高级.doc
热门文章
- 常见三种字符编码的区别:ASCII、Unicode、UTF-8
- save(),saveOrUpdate(),merge()的区别
- XCode5.1.1怎样实现代码块自己主动排版
- Linux Apache php MySQL 安装配置(Centos 6.4 yum安装)
- Java概览(java语言编程艺术笔记)
- vs2010 sp1 安装 Silverlight4_Tools 提示 错误 解决办法
- [Leedcode][JAVA][第209题][长度最小的子数组][滑动窗口][前缀和][二分查找][双指针]
- python可以测试java的代码吗_使用python做你自己的自动化测试--对Java代码做单元测试 (2)-导入第三方jar包裹...
- 7-8 德才论 (25 分)(C语言实现)
- 标准正态分布表_表达矩阵的归一化和标准化,去除极端值,异常值