6_10_6_非Unicode编码
尽管之前多大多数例子都使用Unicode编码,但实际上codecs还可以用于很多其他数据转换。例如,Python包含了处理base-64,bzip2,ROT-13,ZIP和其他数据格式的codecs。
import codecs
import io
buffer = io.StringIO()
stream = codecs.getwriter('rot_13')(buffer)
text = 'abcdefghijklmnopqrstuvwxyz'
stream.write(text)
stream.flush()
print('Original:',text)
print('ROT-13 :',buffer.getvalue())
如果转换可以被表述为有单个输入参数的函数,并且返回一个字节或Unicode串,那么这样的转换都可以注册为一个codec。对于“rot_13”codec,输入应当是一个Unicode串,输出也是一个Unicode串。
运行结果:
使用codecs包装一个数据流,可以提供比直接使用zlib更简单的接口。
import codecs
import io
from codecs_to_hex import to_hex
buffer = io.BytesIO()
stream = codecs.getwriter('zlib')(buffer)
text = b'abcdefghijklmnopqrstuvwxyz\n' * 50
stream.write(text)
stream.flush()
print('Original length :',len(text))
compressed_data = buffer.getvalue()
print('ZIP compressed :',len(compressed_data))
buffer = io.BytesIO(compressed_data)
stream = codecs.getreader('zlib')(buffer)
first_line = stream.readline()
print('Read first line :',repr(first_line))
uncompressed_data = first_line + stream.read()
print('Uncompressed :',len(uncompressed_data))
print('Same :',text == uncompressed_data)
并不是所有压缩或编码系统都支持使用readline()或read()通过流接口读取数据的一部分,因为这需要找到压缩段的末尾来完成解压缩。如果一个程序无法在内存中保存整个解压缩的数据集,那么可以使用压缩库的增量访问特性,而不是codecs。
运行结果: