引言

  无论学习什么程序语言,字符串这种数据类型总是着有非常重要。然而最近在学习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,对于上面的解决方案的解释的原理可能是错误的,希望各位大牛在看到错误的之后能及时指出来,在此感激不尽。

bufferedreader读取中文乱码_python字符乱码的解决小结相关推荐

  1. python 读中文乱码_python字符乱码的解决小结

    引言 无论学习什么程序语言,字符串这种数据类型总是着有非常重要.然而最近在学习python这门语言,想要显示中文,总是出现各种乱码.于是在网上查了很多资料,各说纷纭,我也尝试了许多的方法,有时候可以正 ...

  2. Ogre读取中文路径名的文件失败的解决办法

    Ogre的文件读取是使用的标准库的io库读取的,众所周知的是,在vs2005是存在着bug的. 因此想要一劳永逸的解决这个办法唯有去修改Ogre的源代码,以下为修改方法: 打开OgreFileSyst ...

  3. bufferedreader读取中文乱码_Python读取excel的两种方法

    excel是什么 Microsoft Excel是一个使用非常广泛的电子表格程序.它的用户友好性和吸引人的功能使其成为数据科学中常用的工具.对于excel来说,整个excel文件称为工作簿,工作簿中的 ...

  4. bufferedreader读取中文乱码_python之pandas模块关于csv文件乱码问题解决

    介绍 相信部分小伙伴们在处理windows系统生成的csv文件时会遇到中文显示乱码的问题,尤其是使用Excel打开这类文件时这类问题尤为突出. 解决 如图,我们通过Excel工具打开该csv文件时,中 ...

  5. BufferedReader读取中文文本乱码

    今天测试lucene构建索引时需要从文本中读取数据,使用BufferReader获取文本数据返回乱码.代码如下: public static void main(String[] args) {Fil ...

  6. python中字符串输出乱码怎么解决_python字符乱码的解决小结

    引言 无论学习什么程序语言,字符串这种数据类型总是着有非常重要.然而最近在学习python这门语言,想要显示中文,总是出现各种乱码.于是在网上查了很多资料,各说纷纭,我也尝试了许多的方法,有时候可以正 ...

  7. mysql字符乱码_MySQL字符乱码解决方案

    1.字符集对应查看mysql> show  character  set; +----------+-----------------------------+----------------- ...

  8. php从数据库读取中文显示问号??的解决办法

    出错原因: 1.数据库编码格式不对 2.PHP编码格式不对 3.浏览器编码格式不对 上面三者编码格式不统一,就会出现问题 数据库读取的时候在mysqli_connect()之后要设置连接字符编码mys ...

  9. Altium Designer 22 中文字符乱码

    Altium Designer 22 中文字符乱码 添加字符乱码 解决方式

最新文章

  1. python 装饰器参数_python_如何修改装饰器中参数?
  2. JQuery日记6.5 Javascript异步模式(一)
  3. 干货丨一文看懂什么是“自然语言处理”
  4. java和mysql中md5+base64的执行结果
  5. [linux]Error: failure: repodata/repomd.xml from fedora: [Errno 256] No more mirrors to try.
  6. java abstract类和abstract方法
  7. 华为再发行30亿元超短期融资券
  8. sql server 查询数据库所有的表名+字段
  9. android122 zhihuibeijing 新闻中心NewsCenterPager加载网络数据实现
  10. 直接选择排序和冒泡排序
  11. 测试显卡游戏里FPS温度性能的软件,求一个在游戏中显示FPS 显卡温度之类的工具...
  12. 淘宝 生成 图片二维码分享
  13. 中国远程医疗行业发展前景预测和投资规划分析报告2022-2027年
  14. Github年度百大框架排行榜
  15. 有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下, 有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无
  16. 2018麦考林杂志计算机科学,2020年麦考林杂志排名全解析
  17. 开启少儿武术展演 弘扬中华传统文化
  18. 初学python的体会心得-分享给入门Python小白的学习心得
  19. 研发效能度量实践者指南(万字长文)
  20. Shell - timeout命令

热门文章

  1. 宗宁:全面解析微博财报数据爆发下的平台机会
  2. 巨头的转身 ARM阵营开始烧英特尔的后院
  3. 《Splunk智能运维实战》——3.6 制作每一主机不同请求方法数量的图表
  4. 《Unity虚拟现实开发实战》——第1章,第1.8节小结
  5. Oracle执行计划顺序
  6. Windows下MetaMap工具安装
  7. OpenFiler 配置iscsi共享式存储
  8. .Net Core 在 Linux-Centos上的部署实战教程(二)
  9. 使用WSW将Nginx创建为Windows系统服务
  10. 使用IDEA运行Spark程序