一、引言

  无论学习什么程序语言,字符串这种数据类型总是着有非常重要。然而最近在学习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-

  这行代码的意思是,让解释器用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[],lines[],lines[])
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[],lines[],lines[])
data.append(obj)
f.close()
print len(data)

  这样就解决了。

  4、错误四

  当把文本文件的编码方式换成了utf-8之后,上面的代码就出错了,错误如下:

Traceback (most recent call last):
File "D:\program\Java\PythonOne\src\Test\FileHandle.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[],lines[],lines[])
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

  产生的结果如下:

 ['\xe4\xbd\xa0\xe5\xa5\xbd', 'hello']

 解决方案:

  把该列表一项一项的输出就没有问题。代码如下:

strs=['你好','hello']
print strs[],sts[]

  结果为:

你好 hello

 7、错误7

 我编写python的脚本的编辑器为eclipse,在eclipse中的控制台中的输出结果(中文)是正确编码的,但是在cmd命令窗口中执行py脚本显示的确实乱码。打印代码如下: 

print '等待连接'

  然后我在cmd窗口中执行脚本的时输出的情况如下图:

  出现了乱码。

  解决方案:

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

print u'等待连接'

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

四、总结

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

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

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

  

通过读写文本文件小结“关于python处理中文编码的问题”的更多相关文章

  1. Java读写文本文件操作

    package com.test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; ...

  2. paip.文件读写api php java python总结.txt

    paip.文件读写api php java python总结.txt 一.多种方式读文件内容.    1.按字节读取文件内容   以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. ...

  3. delphi读写文本文件

    delphi读写文本文件   在工作中遇到了这样一个问题,使用PLSQL将一个表的数据转化成一些列的insert语句存储到一个.sql文本中,我本来想使用access数据库中的查询视图一次执行这些语句 ...

  4. 【289】◀▶ Python I/O & 读写文本文件

    参考:Python 文件 I/O 参考:Python OS 文件/目录方法 目录: 01   open 函数 用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写. 02   F ...

  5. python 读写文本文件

    本人最近新学python ,用到文本文件的读取,经过一番研究,从网上查找资料,经过测试,总结了一下读取文本文件的方法. 1.在读取文本文件的时无非有两种方法: a.f=open('filename', ...

  6. python的中文编码问题

    下文转自 http://blog.csdn.net/mayflowers/article/details/1568852 1.        在Python中使用中文 在Python中有两种默认的字符 ...

  7. 03_Android项目中读写文本文件的代码

    编写一下Android界面的项目 使用默认的Android清单文件 <?xml version="1.0" encoding="utf-8"?> & ...

  8. Java入门:读写文本文件

    文本文件的读写是学习java必须掌握的一项基本技术,因为在项目中时常会涉及到文本文件的读写. 一.使用FileWriter写文件 1.FileWriter类 [功能] FileWriter类专门用来写 ...

  9. python处理中文编码

    python2 读取excle中的数据时,对于汉字的读取报错: 代码:data[num][4]={"content": "测试"} data=data[num] ...

随机推荐

  1. 基于SWOOLE的分布式SOCKET消息服务器架构

    消息服务器使用socket,为避免服务器过载,单台只允许500个socket连接,当一台不够的时候,扩充消息服务器是必然,问题来了,如何让链接在不同消息服务器上的用户可以实现消息发送呢? 要实现消息互 ...

  2. docker容器的基本操作

    docker容器是独立运行的一个或一组应用,以及它们的运行态环境.下面具体介绍如何管理一个容器,包括容器的创建,启动和停止等. 启动容器 基于镜像新建一个容器并启动 将终止状态的容器重新启动 新建并启 ...

  3. 解决chrome无法启用印象笔记-剪藏功能

        新版Chrome浏览器安全的问题,导致从印象笔记官网下载的rxs(crx)文件无法直接通过drap&drop功能添加功能块.可以将rxs(crx)文件后缀名改成rar格式,然后解压,通 ...

  4. TestNG参数

    dependsOnMethods可以使测试用例按某个特定的顺序执行 实例: @Test(dependsOnMethods=“s”) public  void  a() System.out.print ...

  5. POJ 1089

    #include <iostream> #include <algorithm> #define MAXN 50005 using namespace std; struct ...

  6. 远程连接MySQL提示 Host is not allowed to connect to this MySQL server

    进入连接的主机修改系统数据库MySQL 下面的user表,把User= root(这里可能是其他你所需要连接的用户名)的这行数据的Host从localhost改为% 如下图: 修改完之后一定要重启My ...

  7. java语言学习指南

    1 java基础 1.1 java语言编程入门 1.2 java语言概述 1.3 java基本语法一 1.4 java基本语法二 1.5 java基本语法三

  8. ContentProvider类的设计分析

    ContentProvider的类设计很好,Transport作为成员存在,完成Binder的功能,有点像组合模式,把完成转发/通信功能 封装为一个内部类,便于转发外部调用给外部类,这种设计在Andr ...

  9. Servlet Filter(过滤器)、Filter是如何实现拦截的、Filter开发入门

    Servlet Filter(过滤器).Filter是如何实现拦截的.Filter开发入门 Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过F ...

  10. wap尝试调取app(网易新闻为例)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...