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结果框就出来了错误。

  代码截图如下:

6f548f13104f390795609181d83cc760.png

原因分析:

  原来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、错误三

  将数据正确读取出来之后就需要把每一行的数据存储到对象中。代码如下:

318400b27f418207e73b997cdbef2784.png


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)

318400b27f418207e73b997cdbef2784.png

  结果出现了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就好了。更改的代码如下:

318400b27f418207e73b997cdbef2784.png


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)

318400b27f418207e73b997cdbef2784.png

  这样就解决了。

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的编码方式就好了。代码如下:

318400b27f418207e73b997cdbef2784.png


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()

318400b27f418207e73b997cdbef2784.png

  这就解决了文本文件为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窗口中执行脚本的时输出的情况如下图:

bf3d9dcd7576575ad33958a81923d898.png

出现了乱码。

解决方案:

要让这个字符串以utf-8的方式去实现,更改的代码如下图:

print u'等待连接'

这下不管是在eclipse的控制台中输出的,还是cmd命令窗口中输出都是正常显示。

四、总结

  尝试过这么多错误之后终于正确的将文本的数据读取,也成功的数据写入到文本文件中。总结一下就那么几点。

  •   源码中的编码方式
  •   环境中的默认编码方式
  •   结果文件中的编码方式

  毕竟是初学python,对于上面的解决方案的解释的原理可能是错误的,希望各位大牛在看到错误的之后能及时指出来,在此感激不尽。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ntnub原理怎么看_老电工由浅入深带你入门学PLC的工作原理和梯形图的编程规则...

PLC编程怎么学&#xff1f;很难吗&#xff1f;工控小白怎么入门学习PLC&#xff1f;需要为学习PLC编程做哪些准备&#xff1f;学习PLC编程时&#xff0c;前期一定要积累相关的理论知识&#xff0c;有了一定的基础&#xff0c;基础打扎实之后就是多练习了。今天推荐的重点&#…

【转】国密加密算法SM系列的C#实现方法

http://www.zhimengzhe.com/bianchengjiaocheng/Javabiancheng/22144.html 在网上搜索SM实现方法&#xff0c;按照上面网站提供方法总是出错&#xff0c;经过调试终于修改好了&#xff0c;给大家以参考&#xff0c;不走弯路了 base64修改&#xff0c;这个看需求&#xff0c;如…

1盒子刷webpad_拉宽带送的盒子也有春天:一招解放各种束缚限制

序言&#xff1a;故事要从一年多前开始说起了&#xff0c;话说...装了宽带之后&#xff0c;移动送了个电视盒子&#xff0c;一次未使用&#xff0c;角落吃灰一年多了&#xff0c;最近有个大胆的想法&#xff01;其实是被逼迫无奈&#xff0c;孩子总是喜欢拿我手机刷抖音&#x…

php udp发送和接收_63、php利用原生socket创建udp服务

1、案例函数汇总2、案例通过socket创建udp服务&#xff0c;获取对端的ip和port信息。并进行打印2.1、udp服务源码/*** Copyright(C) Iamasb* project : 3、workerman相关知识点* explain : 原生socket创建创建udp服务* filename : socket_udp.php* author : Iamasb*/// 创建udp…

【转】C#实现SM3国密加密

C#实现SM3国密加密 本文主要讲解“国密加密算法”SM系列之SM3的C#实现方法&#xff0c;加密规则请详阅国密局发布的文档。 首先需第三方Nuget包&#xff1a;Portable.BouncyCastle &#xff08;源码来自http://www.bouncycastle.org/csharp/&#xff09; 1.1常规处理 /// &l…

mq集群要建传输队列吗_面试官:消息队列这些我必问!

作者&#xff1a;mousycodersegmentfault.com/a/1190000021054802消息队列连环炮项目里怎么样使用 MQ 的&#xff1f;为什么要使用消息队列&#xff1f;消息队列有什么优点和缺点&#xff1f;kafka,activemq,rabbitmq,rocketmq 都有什么去呗&#xff1f;如何保证消息队列高可用…

【转】国密算法sm4 CBC模式加解密

一.什么是CBC模式? CBC模式的全称是Cipher Block Chaining模式&#xff08;密文分组链接模式&#xff09;&#xff0c;之所以叫这个名字&#xff0c;是因为密文分组像链条一样相互连接在一起。 在CBC模式中&#xff0c;首先将明文分组与前一个密文分组进行异或运算&#xff0c…

【转】对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)

版权声明&#xff1a;本文为作者原创&#xff0c;如需转载&#xff0c;请注明出处https://blog.csdn.net/weixin_42940826注&#xff1a;以下图片来自于《图解密码学》&#xff0c;这本书讲的更全面细致&#xff0c;建议阅读&#xff0c;在我资源库中有此书&#xff0c;还有使用…

中发生数据丢失_如何防止Redis脑裂导致数据丢失?

所谓的脑裂&#xff0c;就是指在主从集群中&#xff0c;同时有两个主节点&#xff0c;它们都能接收写请求。而脑裂最直接的影响&#xff0c;就是客户端不知道应该往哪个主节点写入数据&#xff0c;结果就是不同的客户端会往不同的主节点上写入数据。而且&#xff0c;严重的话&a…

【转】TransactionScope事务简介

在.NET 1.0/1.1 版本我们使用SqlTransaction.处理事务 string connString ConfigurationManager.ConnectionStrings["db"].ConnectionString; using (var conn new SqlConnection(connString)) { conn.Open(); using (IDbTransaction tran conn.BeginTransact…

网络通道数2的倍数_限流笔记-通道限流(二)

在工作中的时候&#xff0c;由于我负责的一个系统需要调用很多的第3方的系统&#xff0c;可是呢&#xff0c;这些个第3方的系统的性能完全不一致&#xff0c;有的好有的坏&#xff0c;还成本都不一样&#xff0c;当然了平时把&#xff0c;直接使用成本低的就行了&#xff0c;但…

mysql题目_MySQL练习题

创建下列表并创建相关约束问题1&#xff1a;查询出成绩表&#xff0c;而且student_id 后面要有对应的学生名&#xff0c;course_id 后面要有对应的课程名.1 SELECT2 score.sid,3 score.student_id,4 student.sname,5 score.course_id,6 course.cname,7 score.number8 FROM scor…

查看mysql数据库的死锁日志_【MySQL】mysql死锁以及死锁日志分析

1.死锁的概念死锁&#xff1a;死锁一般是事务相互等待对方资源&#xff0c;最后形成环路造成的。对于死锁&#xff0c;数据库处理方法&#xff1a;牺牲一个连接&#xff0c;保证另外一个连接成功执行。发生死锁会返回ERROR&#xff1a;1213 错误提示&#xff0c;大部分的死锁In…

【转】二进制文件和ASCII文件有何区别

二进制文件和ASCII文件&#xff08;即文本文件&#xff09;的区别&#xff0c;对于和计算机亲近时间尚短的同学是个难题。本文用简单的例子&#xff0c;试图展示其中的道道&#xff0c;希望能对菜鸟们有些帮助。 1、一个例子&#xff1a;两种100000 有程序&#xff1a; #includ…

【转】为什么不能使用字符流读取非文本的二进制文件?

读取文件 刚学Java的IO流部分时&#xff0c;书上说只能使用字节流去读取图片、视频等非文本二进制文件&#xff0c;不能使用字符流&#xff0c;否则文件会损坏。所以我就一直记住这一点了&#xff0c;但是为什么不能使用&#xff0c;这一直是我的一个疑惑。今天&#xff0c;我…

mysql更新一条语句_MySQL一条更新语句是如何执行的

一条查询语句是经过连接器 分析器 优化器 执行器等功能模块&#xff0c;最后到达存储引擎。image以下所说的都基于InnoDb引擎。当有一条记录需要更新的时候&#xff0c;InnoDB引擎会先把记录写到redo log里面&#xff0c;并更新内存&#xff0c;这个时候更新就算完成了。InnoDb…

cesium获取模型实时坐标_Cesium 顶点着色器中求解模型坐标

1. 由世界坐标转模型坐标顶点着色器&#xff1a;attribute vec3 position3DHigh;attribute vec3 position3DLow;attribute vec3 normal;attribute vec2 st;attribute float batchId;varying vec3 v_positionEC;varying vec3 v_normalEC;varying vec2 v_st;void main(){vec3 pos…

【转】关于CLR内存管理一些深层次的讨论[上篇]

半年之前&#xff0c;PM让我在部门内部进行一次关于“内存泄露”的专题分享&#xff0c;我为此准备了一份PPT。今天无意中将其翻出来&#xff0c;觉得里面提到的关于CLR下关于内存管理部分的内存还有点意思。为此&#xff0c;今天按照PPT的内容写了一篇文章。本篇文章不会再讨论…

【转】.NET Remoting

.Net Remoting提供了一种允许一个应用域中的对象与另一个应用域中的对象进行交互的框架。是.NET框架中的一个重要技术改进,它用于减轻运行应用程序的系统开销. 中文名 .Net Remoting 作 用 减轻运行应用程序的系统开销 目录 1 介绍2 .NET Remoting的原理 ▪ 1.NET Rem…

python多重赋值技巧_python教程12课:多元赋值、多重赋值、运算符以及判断字符串类型...

# 多元赋值&#xff1a;# x,y,z 和 1,2,‘String是两个元组&#xff0c;只不过元组的 () 被省略掉了x, y ,z 1, 2, Stringprint(x, y, z)(x, y ,z) (3, 4, String)print(x,y,z)# 一般用在交换变量值#交换变量值常规思路x 10,y 20z 30x ,y, z y,z,xprint(x,y,z)#使用多元赋值…