第六章:文件系统-codecs:字符串编码和解码-非Unicode编码

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。
运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值