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

22.5. chunk – чтение IFF-чанковchunk – Read IFF chunked data

Исходный код: Lib/chunk.py


Этот модуль предоставляет интерфейс для чтения файлов, использующих 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.