22.5. chunk — 读取 IFF 分块数据 — Python 文档

来自菜鸟教程
Python/docs/3.6/library/chunk
跳转至:导航、​搜索

22.5. 大块 — 读取 IFF 分块数据

源代码: :source:`Lib/chunk.py`



该模块提供了一个用于读取使用 EA IFF 85 块的文件的接口。 1 该格式至少用于音频交换文件格式(AIFF/AIFF-C)和真实媒体文件格式(RMFF)。 WAVE 音频文件格式密切相关,也可以使用此模块读取。

一个块具有以下结构:

偏移量 长度 内容
0 4 区块 ID
4 4 大端字节序的块大小,不包括头
8 n 数据字节,其中 n 是前面字段中给出的大小
8 + n 0 或 1 如果 n 是奇数并且使用块对齐,则需要填充字节

ID 是一个 4 字节的字符串,用于标识块的类型。

大小字段(一个 32 位值,使用大端字节序编码)给出了块数据的大小,不包括 8 字节的标头。

通常一个 IFF 类型的文件由一个或多个块组成。 这里定义的 Chunk 类的建议用法是在每个块的开头实例化一个实例,并从该实例中读取直到它到达末尾,之后可以实例化一个新的实例。 在文件末尾,创建新实例将失败,并出现 EOFError 异常。

class chunk.Chunk(file, align=True, bigendian=True, inclheader=False)

代表一个块的类。 file 参数应该是一个类似文件的对象。 此类的实例是特别允许的。 唯一需要的方法是read()。 如果方法 seek()tell() 存在并且不引发异常,它们也会被使用。 如果这些方法存在并引发异常,则预计它们不会更改对象。 如果可选参数 align 为真,则假定块在 2 字节边界上对齐。 如果 align 为假,则假定没有对齐。 默认值是true。 如果可选参数 bigendian 为 false,则假定块大小为 little-endian 顺序。 这是 WAVE 音频文件所需要的。 默认值是true。 如果可选参数 inclheader 为真,则块头中给出的大小包括头的大小。 默认值为假。

Chunk 对象支持以下方法:

getname()

返回块的名称 (ID)。 这是块的前 4 个字节。

getsize()

返回块的大小。

close()

关闭并跳到块的末尾。 这不会关闭基础文件。

如果在调用 close() 方法之后调用,其余方法将引发 OSError。 在 Python 3.3 之前,他们曾经提出 IOError,现在是 OSError 的别名。

isatty()

返回 False

seek(pos, whence=0)

设置块的当前位置。 whence 参数可选,默认为 0(绝对文件定位); 其他值是 1(相对于当前位置搜索)和 2(相对于文件末尾搜索)。 没有返回值。 如果底层文件不允许搜索,则只允许向前搜索。

tell()

将当前位置返回到块中。

read(size=- 1)

从块中最多读取 size 个字节(如果在获取 size 个字节之前读取到达块的末尾,则更少)。 如果 size 参数为负数或省略,则读取所有数据,直到块结束。 当立即遇到块的结尾时,将返回一个空字节对象。

skip()

跳到块的末尾。 对该块的所有进一步调用 read() 将返回 b。 如果您对块的内容不感兴趣,则应调用此方法以使文件指向下一个块的开头。

脚注

1
“EA IFF 85”交换格式文件标准,Jerry Morrison,Electronic Arts,1985 年 1 月。