22.5. chunk — 读取 IFF 分块数据 — Python 文档
22.5. 大块 — 读取 IFF 分块数据
该模块提供了一个用于读取使用 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 月。