chunk — Чтение фрагментированных данных IFF

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

Утратил актуальность с версии 3.11, будет удален в версии 3.13: Модуль chunk устарел (подробнее см. PEP 594).


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

Блок имеет следующую структуру:

Смещение

Длина

Содержание

0

4

Идентификатор блока

4

4

Размер блока в порядке байтов по старшинству, не включая заголовок

8

n

Байты данных, где n - размер, указанный в предыдущем поле

8 + n

0 или 1

Добавочный байт необходим, если n нечетное и используется выравнивание фрагментов

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

Поле size (32-разрядное значение, закодированное с использованием большого порядка байт) указывает размер фрагмента данных, не включая 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, предполагается, что размер фрагмента указан в порядке убывания. Это необходимо для аудиофайлов WAVE. Значение по умолчанию равно true. Если необязательный аргумент inclheader имеет значение true, размер, указанный в заголовке блока, включает размер заголовка. Значение по умолчанию - false.

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

getname()

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

getsize()

Возвращает размер фрагмента.

close()

Закройте и перейдите к концу фрагмента. Это не приведет к закрытию основного файла.

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

isatty()

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

seek(pos, whence=0)

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

tell()

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

read(size=-1)

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

skip()

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

Сноски

Вернуться на верх