Документация Python неофициальный перевод

22.5. chunk – Чтение фрагментированных данных IFFchunk – Read IFF chunked data

Этот модуль предоставляет интерфейс для чтения файлов, использующих EA IFF 85 чанки. [1] Этот формат применяется, как минимум, в Audio Interchange File Format (AIFF/AIFF-C) и Real Media File Format (RMFF). Формат аудиофайлов WAVE тесно связан с ним и также может быть прочитан с помощью этого модуля.

Чанк имеет следующую структуру:

Смещение Длина Содержание
0 4 Идентификатор чанка
4 4 Размер чанка в порядке байтов big-endian, без учета заголовка
8 n Байты данных, где n – размер, указанный в предыдущем поле
8 + n 0 или 1 Байт заполнения, необходимый, если n нечётное и используется выравнивание чанков

Идентификатор представляет собой 4-байтовую строку, которая определяет тип чанка.

Поле размера (32-битное значение, закодированное в порядке байтов big-endian) указывает размер данных чанка, не включая 8-байтовый заголовок.

Обычно файл типа IFF состоит из одного или нескольких чанков. Предлагаемое использование класса Chunk, определённого здесь, – создавать экземпляр в начале каждого чанка и читать из него до конца, после чего можно создать новый экземпляр. В конце файла создание нового экземпляра завершится исключением EOFError.

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

Класс, представляющий чанк. Аргумент file должен быть объектом, подобным файлу. Экземпляр этого класса явно допускается. Единственный необходимый метод – read(). Если методы seek() и tell() присутствуют и не вызывают исключение, они также используются. Если эти методы присутствуют, но вызывают исключение, предполагается, что объект не был изменён. Если необязательный аргумент align равен True, чанки считаются выровненными по границам 2 байт. Если align равен False, выравнивание не предполагается. Значение по умолчанию – True. Если необязательный аргумент bigendian равен False, размер чанка считается в порядке little-endian. Это необходимо для звуковых файлов WAVE. Значение по умолчанию – True. Если необязательный аргумент inclheader равен True, размер, указанный в заголовке чанка, включает размер заголовка. Значение по умолчанию – False.

Объект Chunk поддерживает следующие методы:

getname()

Возвращает имя (идентификатор) чанка. Это первые 4 байта чанка.

getsize()

Возвращает размер чанка.

close()

Закрывает и пропускает до конца чанка. Это не закрывает нижележащий файл.

Остальные методы будут вызывать OSError при вызове после того, как был вызван метод close(). До Python 3.3 они вызывали IOError, который теперь является псевдонимом OSError.

isatty()

Возвращает False.

seek(pos, whence=0)

Устанавливает текущую позицию в чанке. Аргумент whence необязателен и по умолчанию равен 0 (абсолютное позиционирование в файле); другие значения – 1 (относительно текущей позиции) и 2 (относительно конца файла). Возвращаемого значения нет. Если нижележащий файл не поддерживает позиционирование, разрешён только переход вперёд.

tell()

Возвращает текущую позицию в чанке.

read(size=-1)

Читает не более size байт из чанка (меньше, если чтение достигает конца чанка до получения size байт). Если аргумент size отрицательный или опущен, читает все данные до конца чанка. Пустой объект bytes возвращается, если конец чанка встретился сразу.

skip()

Переход к концу чанка. Все последующие вызовы read() для этого чанка будут возвращать b''. Если содержимое чанка не интересует, этот метод следует вызывать, чтобы файл указывал на начало следующего чанка.

Сноски

[1]“EA IFF 85” – стандарт для файлов обменного формата, Jerry Morrison, Electronic Arts, январь 1985.