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'

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值