chunk — Чтение фрагментированных 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 ложное значение, выравнивание не предполагается. Значение по умолчанию истинно. Если необязательный аргумент bigendian имеет ложное значение, предполагается, что размер чанка находится в порядке с прямым порядком байтов. Это необходимо для значения аудиофайлов. Значение по умолчанию истинно. Если необязательный аргумент inclheader истинен, указанный в заголовке фрагмента размер, включает размер заголовка. Значение по умолчанию ложно.

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

getname()

Возвращает имя (ID) чанка. Это первые 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 отрицателен или пропущен, считываются все данные до конца чанка. Возвращается пустой объект байтов, когда сразу же встречается конец чанка.

skip()

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

Сноски

[1]«EA IFF 85» Standard for Interchange Format Files, Jerry Morrison, Electronic Arts, January 1985.