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


      上一篇文章介绍和分析了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中有关中文编码的相关问题分析及解决已接近尾声,由于笔者水平有限,难免出现错误和不当的地方,希望大家多多指正。

  • 相关阅读:
    阿里Java完整学习资料
    Android 矢量图详解
    关于 Android 状态栏的适配总结
    SSM框架视频资料
    hideSoftInputFromWindow
    微信支付
    git+coding.net记录篇
    ClassNotFoundException超限
    react native初步常见问题
    React Native windows搭建记录
  • 原文地址:https://www.cnblogs.com/litaozijin/p/6445502.html
Copyright © 2020-2023  润新知