This document is for an old version of Python that is no longer supported. You should upgrade and read the Python 当前稳定版本的文档.

# 21.6. `chunk` — 读取 IFF 分块数据

本模块提供了一个读取使用 EA IFF 85 分块的数据的接口chunks. 1 这种格式使用的场合有 Audio Interchange File Format (AIFF/AIFF-C) 和 Real Media File Format (RMFF) 等。 与它们密切相关的 WAVE 音频文件也可使用此模块来读取。

一个chunk具有以下结构:

偏移 | 长度 | 目录
--- | --- | ---
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, bigendian, inclheader])

  Class which represents a chunk. The file argument is expected to be a file-like object. An instance of this class is specifically allowed. The only method that is needed is `read()`. If the methods `seek()` and `tell()` are present and don’t raise an exception, they are also used. If these methods are present and raise an exception, they are expected to not have altered the object. If the optional argument align is true, chunks are assumed to be aligned on 2-byte boundaries. If align is false, no alignment is assumed. The default value is true. If the optional argument bigendian is false, the chunk size is assumed to be in little-endian order. This is needed for WAVE audio files. The default value is true. If the optional argument inclheader is true, the size given in the chunk header includes the size of the header. The default value is false.

  `Chunk` 对象支持下列方法：

  `getname`()

    返回分块的名称（ID）。 这是分块的头 4 个字节。

  `getsize`()

    返回分块的大小。

  `close`()

    关闭并跳转到分块的末尾。 这不会关闭下层的文件。

  The remaining methods will raise `IOError` if called after the `close()` method has been called.

  `isatty`()

    返回 `False`。

  `seek`(pos[, whence])

    设置分块的当前位置。 whence 参数为可选项并且默认为 `0` (绝对文件定位)；其他值还有 `1` (相对当前位置查找) 和 `2` (相对文件末尾查找)。 没有返回值。 如果下层文件不支持查找，则只允许向前查找。

  `tell`()

    将当前位置返回到分块。

  `read`([size])

    Read at most size bytes from the chunk (less if the read hits the end of the chunk before obtaining size bytes). If the size argument is negative or omitted, read all data until the end of the chunk. The bytes are returned as a string object. An empty string is returned when the end of the chunk is encountered immediately.

  `skip`()

    Skip to the end of the chunk. All further calls to `read()` for the chunk will return `''`. If you are not interested in the contents of the chunk, this method should be called so that the file points to the start of the next chunk.

备注

1

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