您的位置:首页 > 编程语言 > Python开发

4.2 codecs--Codec注册管理和基类

2015-10-31 09:26 621 查看
本模块定义了Python标准codecs(编码和解码)的基类,也提供了对Python内部codec的注册,管理和数据处理过程。大部分标准的codecs都是文本编解码器,主要是用来把文本怎么样编码成字节方式。不过也有一些codecs是用来从文本到文本的编码方式,或者从字节到字节的编码方式。当然也可以根据基类来定制codecs,可以任意间的数据类型进行转换,只要注意在某些codecs是限制在文本编解码,某些是限制在字节之间编解码的。
对于任何的编解码器codec都有下面的函数:
codecs.encode(obj[, encoding[, errors]]) 
使用已经注册的编码器encoding来对对象obj进行编码,如果有出错按errors方式处理。默认编码器是utf-8。错误处理参数errors可以使用预定的,也可以按后面方法进行自定义。默认是strict方式处理,当出现错误时抛出异常ValueError。
例子:
#python 3.4.3
import codecs

en = codecs.encode('把深圳建设成世界软件中心', 'utf_8', 'strict')
print(en)
结果输出如下:
b'\xe6\x8a\x8a\xe6\xb7\xb1\xe5\x9c\xb3\xe5\xbb\xba\xe8\xae\xbe\xe6\x88\x90\xe4\xb8\x96\xe7\x95\x8c\xe8\xbd\xaf\xe4\xbb\xb6\xe4\xb8\xad\xe5\xbf\x83'
 
codecs.decode(obj[, encoding[, errors]]) 
使用已经注册的编码器encoding把对象obj进行解码,如果有出错按出错机制errors处理。默认编码器是utf-8。错误处理参数errors可以使用预定的,也可以按后面方法进行自定义。默认是strict方式处理,当出现错误时抛出异常ValueError。
例子:#python 3.4.3
import codecs

en = codecs.encode('把深圳建设成世界软件中心', 'utf_8', 'strict')
print(en)

de = codecs.decode(en, 'utf_8', 'strict')
print(de)
结果输出如下:
b'\xe6\x8a\x8a\xe6\xb7\xb1\xe5\x9c\xb3\xe5\xbb\xba\xe8\xae\xbe\xe6\x88\x90\xe4\xb8\x96\xe7\x95\x8c\xe8\xbd\xaf\xe4\xbb\xb6\xe4\xb8\xad\xe5\xbf\x83'
把深圳建设成世界软件中心

codecs.lookup(encoding)
通过编解码器的名称encoding来查找编解码器,如果成功找到返回CodecInfo对象,否则抛出异常LookupError。
例子:

#python 3.4.3
import codecs

cinfo = codecs.lookup('utf_8')
print(cinfo)

cinfo = codecs.lookup('gb2312')
print(cinfo)

cinfo = codecs.lookup('test')
print(cinfo)

结果输出如下:
<codecs.CodecInfo object for encoding utf-8 at 0x29a6500>
<codecs.CodecInfo object for encoding gb2312 at 0x29bf420>
Traceback (most recent call last):
  File "E:/pywin/codecs1.py", line 10, in <module>
    cinfo = codecs.lookup('test')
LookupError: unknown encoding: test
 
codecs.getencoder(encoding) 
通过encoding获取编码器的编码函数,简化对编码的重复调用。如果找不到抛出异常LookupError。
例子:#python 3.4.3
import codecs

cinfo = codecs.getencoder('utf_8')
print(cinfo)
en = cinfo('深圳软件')
print(en)

cinfo = codecs.getencoder('gb2312')
print(cinfo)
结果输出如下:
<built-in function utf_8_encode>
(b'\xe6\xb7\xb1\xe5\x9c\xb3\xe8\xbd\xaf\xe4\xbb\xb6', 4)
<built-in method encode of MultibyteCodec object at 0x029FB150>
 
codecs.getdecoder(encoding)
通过encoding获取解码器的函数。简化对解码的重复调用。如果找不到抛出异常LookupError。
例子:
#python 3.4.3
import codecs
 
cinfo = codecs.getdecoder('utf_8')
print(cinfo)
 
de = cinfo(b'\xe6\xb7\xb1\xe5\x9c\xb3\xe8\xbd\xaf\xe4\xbb\xb6')
print(de)
结果输出如下:
<function decode at 0x00261E88>
('深圳软件', 12)
 
codecs.getincrementalencoder(encoding) 
返回一个encoding编码的增量编码器。如果没有找到抛出异常LookupError。
例子:
#python 3.4.3
import codecs
 
encoder = codecs.getincrementalencoder('idna')()
print(encoder)
 
encoder.reset()
en = encoder.encode(u"\xe4x")
en = encoder.encode(u"ample.org")
en = encoder.encode(u"", True)
print(en)
结果输出如下:
<encodings.idna.IncrementalEncoder object at 0x029BB4B0>
b'org'
 
codecs.getincrementaldecoder(encoding) 
返回一个encoding编码的增量解码器。如果没有找到抛出异常LookupError。
例子:
#python 3.4.3
import codecs
 
d = codecs.getincrementaldecoder("utf-8-sig")()
s = u"spam"
print(d.decode(s.encode("utf-8-sig")))
结果输出如下:
spam
 
codecs.getreader(encoding) 
返回一个encoding编码的流读取对象StreamReader,如果查找不到抛出异常 LookupError。
例子:
#python 3.4.3
import codecs
import urllib.request, json
 
f = urllib.request.urlopen("https://pypi.python.org/pypi/{}/{}/json".
                        format('jsonpatch', '1.11' or ''))
reader = codecs.getreader("utf-8")
pkg_data = json.load(reader(f))
f.close()
 
d = {}
d['name'] = pkg_data['info']['name']
d['homepage'] = pkg_data['info'].get('home_page', '')
        
print(d)
结果输出如下:
{'homepage': 'https://github.com/stefankoegl/python-json-patch', 'name': 'jsonpatch'}
 
codecs.getwriter(encoding) 
返回一个encoding解码的流写入对象StreamWriter,如果查找不到抛出异常 LookupError。
例子:
#python 3.4.3
import io, codecs
 
s = io.BytesIO()
c = codecs.getwriter('gb18030')(s)
c.write('test')
print(s.getvalue())
结果输出如下:
b'test'
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息