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

Вихідний код: Lib/chunk.py

Застаріло починаючи з версії 3.11: Модуль chunk є застарілим (див. PEP 594 для деталей).


Цей модуль забезпечує інтерфейс для читання файлів, які використовують фрагменти EA IFF 85. 1 Цей формат використовується принаймні у форматі файлів обміну аудіофайлами (AIFF/AIFF-C) і форматі реальних медіафайлів (RMFF). Формат аудіофайлу WAVE тісно пов’язаний і його також можна читати за допомогою цього модуля.

Чанк має таку структуру:

Зсув

Довжина

Зміст

0

4

ID блоку

4

4

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

8

n

Байти даних, де n — розмір, указаний у попередньому полі

8 + n

0 або 1

Якщо n є непарним і використовується вирівнювання фрагментів, необхідний байт заповнення

Ідентифікатор — це 4-байтовий рядок, який ідентифікує тип послідовності.

Поле розміру (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 є хибним, розмір блоку вважається таким, що має порядок кінців від маленького. Це потрібно для аудіофайлів WAVE. Значення за замовчуванням - true. Якщо необов’язковий аргумент inclheader має значення true, розмір, указаний у заголовку блоку, включає розмір заголовка. Значення за замовчуванням - false.

Об’єкт 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» Стандарт для файлів формату обміну, Джеррі Моррісон, Electronic Arts, січень 1985 р.