转自: https://xrlin.github.io/解决python2.x文件读写编码问题/

python2.X版本在处理中文文件读写时经常会遇到乱码或者是UnicodeError错误,正如下面的程序所示:

  1. #coding=utf-8
  2. # test.txt是一个以gbk2312编码(简体中文windows系统中的默认文本编码)的文本文件
  3. # 文本写入
  4. with open('test.txt', 'a') as f:
  5. f.write('test') # 正常写入
  6. f.write('测试') # 正常写入,乱码
  7. f.writeu’测试') # 写入错误,触发UnicodeEncodeError异常
  8. # 文本读取
  9. with open('test.txt') as f:
  10. for line in f:
  11. print line, type(line) # 输出test娴嬭瘯, <type 'str'>

由于脚本源文件中的字符为utf-8编码,而文本文档中的字符为gb2312编码,所以以str类型字符串直接写入文件,此时str字符串的编码与文件编码不同,导致乱码。 直接str类型参数传递给write方法容易导致乱码问题,直接传递Unicode类型字符串作为write的参数,会导致UnicodeEncodeError错误,这是因为python2在写入unicode字符串时会自动尝试转码为ascii编码,而ascii编码并不能处理中文。 知道了问题的根源,首先想到的解决方法就是对源字符串按照文件进行编码,保证编码正确。

  1. # 解决方法1
  2. with open('test.txt', 'w') as f:
  3. f.write('测试'.decode('utf-8').encode('gb2312'))
  4. f.write(u'测试‘.ecode('gb2312')

如果是str类型的字符串,需要使用decode(因为我在脚本中设定#coding=utf8,所以使用decode(‘utf-8’))将其改变为python内部使用的Unicde编码然后使用encode转换成对应的编码类型。

读写操作都需要进行编码转换是个容易导致错误而且烦人的问题,python中提供了codecs这个内置自然语言处理模块方便我们进行不同编码语言的处理,codecs模块的open方法可以指定encoding参数设定文件的编码格式,以后codecs会自动处理文件的读写编码问题,读取的字符串和写入时的字符串参数统一使用python的Unicode类型。使用codecs的open方法代替原来的open方法发可以摆脱烦人的文件编码问题。

  1. with codecs.open('test.txt', 'w', encoding='utf-8') as f:
  2. f.write(u'测试')
  3. with codecs.open('text.txt', encoding='utf-8') as f:
  4. for line in f:
  5. print line, type(line) # output: 测试<type 'unicode'>

解决python2.x文件读写编码问题的更多相关文章

  1. 【原创】python中文编码问题深入分析(三):python2.7文件读写中文编码问题

    上一篇文章介绍和分析了python2.7中使用print遇到的中文编码问题的原因和解决方案,本篇主要介绍一下python2.7中执行文件读写可能遇到的编码问题. 1.文件读取 假如我们读取一个文件,文 ...

  2. XML文件读写编码不是UTF-8的问题

    FileWriter和FileReader在写.读文件时,使用系统当前默认的编码方式. 在中文win下encoding基本是GB2312,在英文win下基本是ISO-8859-1.所以要创建一个UTF ...

  3. python 文件读写编码

  4. 第六篇.文件处理之python2和3字符编码的区别

    目录 python2和3字符编码的区别 一.字符编码应用之python python2和3字符编码的区别 一.字符编码应用之python 1执行python的三个阶段 python test.py 执 ...

  5. 解决Python2中文ascii编码的方法

    在YiiChina签到的时候,经常会看到有人在说说里面发群主是最帅的,yii 是 PHP 最好的框架,没有之一,就想到使用一言,在每天签到的时候也发一句话 同时使用方糖将内容推送到微信,防止有什么不对 ...

  6. Java文件读写操作指定编码方式防乱码

    读文件:BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而提供字符.数组和行的高效读取. 可以指定缓冲区的大小,或者可使用默认的大小.大多数情况下,默认值就足够大了. 通常,Re ...

  7. Python之文件读写

    本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input ...

  8. 解决Python2.7的UnicodeEncodeError:'ascii' codec can't encode characters in position 0-78: ordinal not in range(128)异常错误

    解决Python2.7的UnicodeEncodeError: 'ascii' codec can't encode异常错误 大家都知道,在使用python进行网络爬虫时,最头疼的就是转码问题,下面是 ...

  9. 【转】Python之文件读写

    [转]Python之文件读写 本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 ...

随机推荐

  1. 正则表达式 grep文本查询 sed流处理 应用

    一.正则表达: ^:以什么什么开头,^a:以a字符开头 $:以什么什么结尾,b$:以b字符结尾 *:左边字符0-无穷个 +:左边字符1-无穷个 .:代表单字符 ?:前导字符为零个或1个 {n}:左面字 ...

  2. Linux日志文件/var/log详解

    更多内容推荐微信公众号,欢迎关注: 如果愿意在Linux环境方面花费些时间,首先就应该知道日志文件的所在位置以及它们包含的内容.在系统运行正常的情况下学习了解这些不同的日志文件有助于你在遇到紧急情况时 ...

  3. 20165227 学习基础和C语言基础调查

    学习基础和C语言基础调查 技能学习经验和感悟 你有什么技能比大多人(超过90%以上)更好? 如果非要说出来一个的话,那就是篮球了.从热爱篮球,到热爱打篮球,经历挫折阻碍,不断反思学习,一步一步地向前迈 ...

  4. TCP确认延时和Nagle算法

    TCP确认延时和Nagle算法 nagle 算法是   发送端 收到前一个报文的确认然后再发送下一个tcp数据.这样可以避免大量的小数据. TCP_NODELAY选项控制. Delay ACK是   ...

  5. Java高性能并发编程——线程池

    在通常情况下,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的 ...

  6. 利用CSS函数calc(...)实现Web页面左右布局

    前言 因为自己的网站需要,想要做一个左右布局的页面: 左边是导航菜单之类的东西.右边是文档内容(因为最近看的一些软件的文档页面都是这么布局的): 左边固定宽度——300像素.右边使用剩余的宽度: 左边 ...

  7. JQuery怎么实现页面左侧菜单刷新后保留鼠标点击addclass的样式?

    $('ul.main-menu li a').each(function(){ if($($(this))[0].href==String(window.location)) $(this).pare ...

  8. linux下快速安装emacs方法

    背景 在公司工作的时候经常需要在很多服务器之间切换,而公司的服务器上一般都没emacs,因此总结一下快速安装emacs的方法. 最简单的是直接使用yum安装,但是有两个问题,一个是有的生产服务器直接没 ...

  9. opencv(2)绘图

    绘制直线 函数为:cv2.line(img,Point pt1,Point pt2,color,thickness=1,line_type=8 shift=0) 有值的代表有默认值,不用给也行.可以看 ...

  10. SQL行列转换的另一种方法

    create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)insert into tb values('张三' , '语文' , 74)inse ...