当前位置:
首页 > Python基础教程 >
-
Python3标准库:codecs字符串编码和解码(5)
)
encoded_file.write(utf8)
# Fetch the buffer contents as a UTF-16 encoded byte string
utf16 = output.getvalue()
print('Encoded to UTF-16:', to_hex(utf16, 2))
# Set up another buffer with the UTF-16 data for reading,
# and wrap it with another EncodedFile.
buffer = io.BytesIO(utf16)
encoded_file = codecs.EncodedFile(buffer, data_encoding='utf-8',
file_encoding='utf-16')
# Read the UTF-8 encoded version of the data.
recoded = encoded_file.read()
print('Back to UTF-8 :', to_hex(recoded, 1))
这个例子显示了如何读写EncodedFile()返回的不同句柄。不论这个句柄用于读还是写,file_encoding总是指示总是指示打开文件句柄所用的编码(作为第一个参数传入),data_encoding值则指示通过read()和write()调用传递数据时所用的编码。
1.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
- 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。
1.7 增量编码
目前提供的一些编码(特别是bz2和zlib)在处理数据流时可能会显著改变数据流的长度。对于大的数据集,这些编码采用增量方式可以更好的处理,即一次只处理一个小数据块。IncrementalEncoder/IncreamentalDecoder API就是为此而设计。
- import codecs
- import sys
- text = b'abcdefghijklmnopqrstuvwxyz\n'
- repetitions = 50
- print('Text length :', len(text))
- print('Repetitions :', repetitions)
- print('Expected len:', len(text) * repetitions)
- # Encode the text several times to build up a
- # large amount of data
- encoder = codecs.getincrementalencoder('bz2')()
- encoded = []
- print()
- print('Encoding:', end=' ')
- last = repetitions - 1
- for i in range(repetitions):
- en_c = encoder.encode(text, final=(i == last))
- if en_c:
- print('\nEncoded : {} bytes'.format(len(en_c)))
- encoded.append(en_c)
- else:
- sys.stdout.write('.'
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式