详解Python的codecs模块

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解Python的codecs模块相关的知识,希望对你有一定的参考价值。

浅析Python的codecs模块

编码转化

codecs专门用作编码转换

# -*- encoding: gb2312 -*- 
import  codecs, sys

print   ' - ' * 60 
#  创建gb2312编码器 
look   =  codecs.lookup( " gb2312 " )
#  创建utf-8编码器 
look2  =  codecs.lookup( " utf-8 " )

a  =   " 我爱北京 " 

print  len(a), a
#  把a编码为内部的unicode, 但为什么方法名为decode呢,我的理解是把gb2312的字符串解码为unicode 
b  =  look.decode(a)
#  返回的b[0]是数据,b[1]是长度,这个时候的类型是unicode
print  b[1], b[0], type(b[0])
#  把内部编码的unicode转换为gb2312编码的字符串,encode方法会返回一个字符串类型 
b2  =  look.encode(b[0])
#  发现不一样的地方了吧?转换回来之后,字符串长度由14变为了7! 现在的返回的长度才是真正的字数,原来的是字节数 
print  b2[1], b2[0], type(b2[0])
#  虽然上面返回了字数,但并不意味着用len求b2[0]的长度就是7了, 仍然还是14,仅仅是codecs.encode会统计字数 
print  len(b2[0])

上面的代码就是codecs的使用,是最常见的用法。另外还有一个问题就是,如果我们处理的文件里的字符编码是其他类型的呢?这个读取进行做处理也需要特殊的处理的。codecs也提供了方法.

codecs.open()

上面的代码就是codecs的使用,是最常见的用法。另外还有一个问题就是,如果我们处理的文件里的字符编码是其他类型的呢?这个读取进行做处理也需要特殊的处理的。codecs也提供了方法。

# -*- encoding: gb2312 -*- 
import  codecs, sys

#  用codecs提供的open方法来指定打开的文件的语言编码,它会在读 取的时候自动转换为内部unicode 
bfile  =  codecs.open("dddd.txt " ,  ' r ' ,  " big5 " )
# bfile = open("dddd.txt", 'r') 

ss  =  bfile.read()
bfile.close()
#  输出,这个时候看到的就是转换后的结果。如果使用语言内建的open函数 来打开文件,这里看到的必定是乱码 
print(ss, type(ss))

字符的编码是按照某种规则在单字节字符和多字节字符之间进行转换的某种方法。从单字节到多字节叫做decoding,从多字节到单字节叫做encoding。在这些规则中经常用到的无非是UTF-8和GB2312两种。

在Python中,codecs模块提供了实现这些规则的方法,通过模块公开的方法我们能够方便地获取某种编码方式的Encoder和 Decoder工厂函数(Factory function),以及StreamReader、StreamWriter和StreamReaderWriter类。

使用“import codecs”导入codecs模块。

codecs模块中重要的函数之一是lookup,它只有一个参数encoding,指的是编码方式的名称,即utf-8或者gb2312等 等。如下示例:

>>> import codecs
>>> t = codecs.lookup("utf-8" )
>>> print t
(<built-in function utf_8_encode>, <function decode at 0x00AA25B0>, <class encodings.utf_8.StreamReader at 0x00AA0720>, <class encodings.utf_8.StreamWriter at 0x00AA06F0>) 
>>> encoder = t[0]
>>> decoder = t[1]
>>> StreamReader = t[2]
>>> StreamWriter = t[3]

lookup函数返回一个包含四个元素的TUPLE,其中t[0]是encoder的函数引用,t[1]是decoder的函数引用,t[2] 是UTF-8编码方式的StreamReader类对象引用,t[3]是UTF-8编码方式的StreamWriter类对象引用相信对Python熟悉的你肯定知道接下来该怎么用它们了。

codecs模块还提供了方便程序员使用的单独函数,以简化对lookup的调用。它们是:

getencoder(encoding)
getdecoder(encoding)
getreader(encoding)
getwriter(encoding)

如果我们只是想获取一种utf-8编码的encoder方法,那么只需要这样做:

>>> encoder = codecs.getencoder("utf-8" )

另外,对于StreamReader和StreamWriter的简化, codecs模块提供一个open方法。相对于built-in对象File的open方法,前者多了三个参数encoding, errors, buffering。这三个参数都是可选参数,但是对于应用来说,需要明确指定encoding的值,而errors和buffering使用默认值即可。使用方法如下:

>>> fin = codecs.open("e://mycomputer.txt" , "r" , "utf-8" )
>>> print fin.readline()
这是我的电脑 
>>> fin.close()

总结

  • 总结一下,codecs模块为我们解决的字符编码的处理提供了lookup方法,它接受一个字符编码名称的参数,并返回指定字符编码对应的 encoder、decoder、StreamReader和StreamWriter的函数对象和类对象的引用。

  • 为了简化对lookup方法的调用, codecs还提供了getencoder(encoding)、getdecoder(encoding)、getreader(encoding)和 getwriter(encoding)方法;进一步,简化对特定字符编码的StreamReader、StreamWriter和 StreamReaderWriter的访问,codecs更直接地提供了open方法,通过encoding参数传递字符编码名称,即可获得对encoder和decoder的双向服务。

Reference

https://cloud.tencent.com/developer/article/1823452

加油!

感谢!

努力!

以上是关于详解Python的codecs模块的主要内容,如果未能解决你的问题,请参考以下文章

如何使用codecs模块将unicode数据娉蒰bk格式

codecs模块, decodeencode

Python2.7-codecs

python2.7应用codecs模块处理包含中文的读写问题

python2.7应用codecs模块处理包含中文的读写问题

python codecs模块 ---处理数据写入文件时会有编码不统一的问题