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

本模块定义了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'

 

 


发布了2031 篇原创文章 · 获赞 545 · 访问量 758万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览