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

  1.文件读取

   假如我们读取一个文件,文件保存时,使用的编码格式,决定了我们从文件读取的内容的编码格式,例如,新建一个文本文件test.txt, 编辑内容,保存的时候注意,编码格式设定为gb2312,那么使用python读取文件内容,方式如下:

f = open('test.txt','r')
s = f.read() #读取文件内容,如果是不识别的encoding格式(识别的encoding类型跟使用的系统有关),这里将读取失败
'''假设文件保存时以gb2312编码保存'''
u = s.decode('gb2312') #以文件保存格式对内容进行解码,获得unicode字符串
'''下面我们就可以对内容进行各种编码的转换了'''
str = u.encode('utf-8')#转换为utf-8编码的字符串str
strGbk = u.encode('gbk')#转换为gbk编码的字符串str1

  注意:1)调用read()函数文件test.txt时,如果test.txt文件中不包含BOM信息(BOM信息一般是3个字节,用于标识文件的编码格式),则系统会使用现在支持的文件编码格式(utf-8,gbk等,优先使用utf-8,最后使用系统默认的编码方式),尝试着读取和解析text.txt,如果能打开并解析成功(假设以gbk编码方式能正确打开test.txt),那么s的编码类型gbk 。

     2)如果open时使用的encoding和文件本身的encoding不一致的话,那么这里将将会产生错误

     3)s的类型为str

  此外,python提供了codecs包,可供进行文件的读取,包中的open()函数可以指定文件编码的类型:

import codecs
f = codecs.open('text.text','r+',encoding='utf-8')#必须事先知道文件的编码格式,这里文件编码是使用的utf-8
content = f.read()#如果open时使用的encoding和文件本身的encoding不一致的话,那么这里将将会产生错误
f.write('你想要写入的信息')
f.close()

  注意:1)必须事先知道文件的编码格式,这里文件编码是使用的utf-8   2)如果open时使用的encoding和文件本身的encoding不一致的话,那么这里将将会产生错误

     3) content的类型为unicode。

  2.文件写入 

    调用python文件写入函数时,如果待写入变量unStr是unicode类型,则系统首先使用系统的默认编码方式,将unStr变量进行unicode编码成str的类型,然后再写入文件。

unStr=u"测试"
f = open('test.txt','w')
f.write(unStr) #如果系统的默认编码是asii,则会出现UnicodeEncodeError问题

  如果系统的默认编码方式是ascii,则就会出现上文中提到的UnicodeEncodeError问题。解决方法有两个:

    1) 首先获取文件的默认编码格式,执行write函数前,将unStr编码成文件的默认编码格式,例如:在我的机器上,创建一个新文件时,其文件编码格式为utf-8,则修改f.write(unStr) 为f.write(unStr.encoding('utf-8'))。(建议选这一种)

    2) 修改系统的默认编码方式为utf-8;

  3. 关于sys.setdefaultencoding()和sys.stdout.encoding()

        1) sys.setdefaultencoding()是str类型编解码时默认使用的编码格式,文件读写、str类型编码,在不明确指定编码格式的情况下均使用 sys.setdefaultencoding()

      #! /usr/bin/env python 
      # -*- coding: utf-8 -*- 
      s = '中文字符'  # 这里的 str 是 str 类型的,而不是 unicode 
      s.encode('gb2312')

  这句代码将 s 重新编码为 gb2312 的格式,即进行 unicode -> str 的转换。因为 s 本身就是 str 类型的,因此 Python
会自动的先将 s 解码为 unicode ,然后再编码成 gb2312。因为解码是python自动进行的,我们没有指明解码方式,python
就会使用 sys.defaultencoding 指明的方式来解码。很多情况下 sys.defaultencoding为ANSCII,如果 s
不是这个类型就会出错。
  UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 
  0: ordinal not in range(128)

2)sys.stdout.encoding() 是终端输出的默认编码格式,例如:print

    至此,python2.7中有关中文编码的相关问题分析及解决已接近尾声,由于笔者水平有限,难免出现错误和不当的地方,希望大家多多指正。

【原创】python中文编码问题深入分析(三):python2.7文件读写中文编码问题的更多相关文章

  1. 解决python2.x文件读写编码问题

    转自: https://xrlin.github.io/%E8%A7%A3%E5%86%B3python2.x%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99%E7%BC%96 ...

  2. Python笔记之 - 一张截图诠释"文件读写" !

    Python笔记之 - 一张截图诠释"文件读写" ! 源代码如下: # 文件读写 str_test1 = "先创建txt文件再写入内容: 我是大帅哥" # wi ...

  3. Python自动化--语言基础4--模块、文件读写、异常

    模块1.什么是模块?可以理解为一个py文件其实就是一个模块.比如xiami.py就是一个模块,想引入使用就在代码里写import xiami即可2.模块首先从当前目录查询,如果没有再按path顺序逐一 ...

  4. python自动化--语言基础四模块、文件读写、异常

    模块1.什么是模块?可以理解为一个py文件其实就是一个模块.比如xiami.py就是一个模块,想引入使用就在代码里写import xiami即可2.模块首先从当前目录查询,如果没有再按path顺序逐一 ...

  5. oop 第三次作业 文件读写

    oop第三次作业 GitHub 对于迟交我感到很抱歉 031602510 体会 这次的用到了之前的文件读写,传参 定义函数有返回值,使代码更加简洁.面向对象的程序设计,在面对函数多元的情况下,编程更加 ...

  6. Python学习(九)IO 编程 —— 文件读写

    Python 文件读写 Python内置了读写文件的函数,用法和C是兼容的.本节介绍内容大致有:文件的打开/关闭.文件对象.文件的读写等. 本章节仅示例介绍 TXT 类型文档的读写,也就是最基础的文件 ...

  7. Python基础(十六):文件读写,靠这一篇就够了!

    文件读写的流程 类比windows中手动操作txt文档,说明python中如何操作txt文件? 什么是文件的内存对象(文件句柄)? 演示怎么读取文件 ① 演示如下 f = open(r"D: ...

  8. Python学习笔记(三):文件和集合操作

    python string与list互转 因为python的read和write方法的操作对象都是string.而操作二进制的时候会把string转换成list进行解析,解析后重新写入文件的时候,还得 ...

  9. Python之文件读写

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

随机推荐

  1. Python3 编写登陆接口

    题目选自 Alex Python自动化开发之路的题目,我是从C++转学Python的,编写的水平有限,轻喷. 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 首先应该有2个txt文件,包含用户 ...

  2. Serial Fluent UDF on Windows

    test test Table of Contents 1. Serial UDF on Windows OS 1 Serial UDF on Windows OS Note: Udf has to ...

  3. Linux排查java程序占用cpu过高的线程代码

    分几步骤: 1.通过top,查出占用CPU过高的java进程 ,比如: pid :6666 2.通过ps -mp 6666 -o THREAD,tid,time| sort -n -k1 -r 查看此 ...

  4. 洛谷 P2997 [USACO10NOV]旗帜Banner

    P2997 [USACO10NOV]旗帜Banner 题目背景 题目大意(by:曹彦臣): 平面上有(0,0)到(n,m)的(n+1)*(m+1)个点.问有多少点对所连的线段不过其他点,且长度在[l, ...

  5. Python获取当前系统时间

    Python获取当前系统时间 import time #返回当前时间 def GetNowTime():     return time.strftime("%Y-%m-%d %H:%M:% ...

  6. PHP array_intersect_key()

    定义和用法 array_intersect_key() 函数使用键名比较计算数组的交集. array_intersect_key() 返回一个数组,该数组包含了所有出现在被比较的数组中并同时出现在所有 ...

  7. Java Json格式的字符串转变对象

    Java Json格式的字符串转变对象: 方法还是比较多的: 学习:https://my.oschina.net/heweipo/blog/386808 其中的jsonlib说明:http://www ...

  8. Application Framework层介绍

    http://write.blog.csdn.net/postedithttp://write.blog.csdn.net/postedithttp://write.blog.csdn.net/pos ...

  9. 如何杀掉(kill)Oracle中的会话(Session)

    Oracle中造成一些表被死锁或者会话异常退出,如执行了更新记录操作后,既没有commit也没有rollback,网络就断开了,也会造表或记录被锁住,待到超时后才会被解开,那样都会造成应用操作被阻塞. ...

  10. HDU 3247 Resource Archiver (AC自己主动机 + BFS + 状态压缩DP)

    题目链接:Resource Archiver 解析:n个正常的串.m个病毒串,问包括全部正常串(可重叠)且不包括不论什么病毒串的字符串的最小长度为多少. AC自己主动机 + bfs + 状态压缩DP ...