文件——二进制字节文件 | 第二部分 类型与操作 —— 第 4 章: 介绍 python 对象类型 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-金年会app官方网

未匹配的标注

前一节的例子展示了足以满足许多任务的文件基础。然而,技术上讲,它们要么依赖于python 3系列 中平台的 unicode 编码默认值,要么依赖于 python 2系列中文件的8比特字节特性。文本文件在3系列中总是编码字符串,且在2系列中总是盲目地写入字符串内容(而不考虑unicode编码值)。这对之前使用的简单ascii数据来说是无关紧要的,因为它和文件字节在转换过程中是相同的。但对更复杂的数据类型,文件接口会根据内容和使用python系列的不同而不同。

如之前碰到字符串时所暗示的,python 3系列描述了文件中的文本和二进制数据的巨大差异:文本文件用普通 str 字符串表示内容且在读写数据时自动执行unicode编码和解码,而 二进制文件用特殊的bytes字符串来表示且允许不变的访问文件内容。python 2系列支持同样的差异,但不像3系列那样严格执行,而且它的工具也不同。

比如,二进制文件对处理媒体数据,访问c程序创建的数据等都很有用。比如,python的 struct 模块既能创建打包好的二进制数据(记录不是python对象的数值的原始字节,让其以二进制模式写入文件),也能解包它。本书后面将会详细研究这个技术,但概念很简单:下面代码在python 3系列中创建了一个二进制文件(二进制文件在2系列中工作原理相同,但 b字符串文字前缀不是必须的且不会被显示):

>>> import struct
>>> packed = struct.pack('>i4sh', 7, b'spam', 8) # 创建打包好的二进制数据
>>> packed # 10 个字节,不是对象或文本
b'\x00\x00\x00\x07spam\x00\x08'
>>>
>>> file = open('data.bin', 'wb') # 打开二进制输出文件
>>> file.write(packed) # 写入打包好的二进制数据
10
>>> file.close()

读回二进制数据本质上是对称的;不是所有程序都需要如此深入涉及到字节的底层领域,但二进制文件让这在python中变得容易:

>>> data = open('data.bin', 'rb').read() # 打开/读取二进制数据文件
>>> data # 10个字节,未被改变
b'\x00\x00\x00\x07spam\x00\x08'
>>> data[4:8] # 在中间切割字节
b'spam'
>>> list(data) # 一个8比特字节的序列
[0, 0, 0, 7, 115, 112, 97, 109, 0, 8]
>>> struct.unpack('>i4sh', data) # 再次解包为对象
(7, b'spam', 8)

本文章首发在 金年会app官方网 网站上。

上一篇 下一篇
讨论数量: 0



暂无话题~
网站地图