wave.md
1> **Источник:** https://python-all.ru/3.14/library/wave.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `wave` – чтение и запись WAV-файлов89**Исходный код:** [Lib/wave.py](https://python-all.ru/src/3.14/Lib/wave.py)1011---1213Модуль `wave` предоставляет удобный интерфейс для работы с аудиоформатом Waveform Audio «WAVE» (или «WAV»). Поддерживаются только несжатые WAV-файлы в кодировке PCM.1415Изменено в версии 3.12: Добавлена поддержка заголовков `WAVE_FORMAT_EXTENSIBLE` при условии, что расширенный формат имеет значение `KSDATAFORMAT_SUBTYPE_PCM`.1617Модуль `wave` определяет следующие функцию и исключение:1819#### `wave.open(file, mode=None)`2021Если *file* – строка, открывается файл с таким именем, в противном случае он рассматривается как файлоподобный объект. Параметр *mode* может принимать следующие значения:2223**`'rb'`**2425Режим только для чтения.2627**`'wb'`**2829Режим только для записи.3031Обратите внимание: не поддерживаются WAV-файлы, открытые одновременно на чтение и запись.3233Значение *mode*, равное `'rb'`, возвращает объект [`Wave_read`](https://python-all.ru/3.14/library/wave.html#wave.Wave_read), а значение *mode*, равное `'wb'`, возвращает объект [`Wave_write`](https://python-all.ru/3.14/library/wave.html#wave.Wave_write). Если *mode* опущен и в качестве *file* передан файлоподобный объект, то `file.mode` используется как значение по умолчанию для *mode*.3435Если передан файлоподобный объект, объект wave не закроет его при вызове метода `close()`; закрытие файлового объекта – ответственность вызывающей стороны.3637Функция `open()` может использоваться в операторе [`with`](https://python-all.ru/3.14/reference/compound_stmts.html#with). Когда блок `with` завершается, вызывается метод [`Wave_read.close()`](https://python-all.ru/3.14/library/wave.html#wave.Wave_read.close) или [`Wave_write.close()`](https://python-all.ru/3.14/library/wave.html#wave.Wave_write.close).3839Изменено в версии 3.4: Добавлена поддержка файлов без произвольного доступа.4041#### `exception wave.Error`4243Исключение, возникающее, когда какое-либо действие невозможно, поскольку оно нарушает спецификацию WAV или сталкивается с недостатком реализации.4445## Объекты Wave\_read4647#### `class wave.Wave_read`4849Чтение WAV-файла.5051Объекты Wave\_read, возвращаемые функцией [`open()`](https://python-all.ru/3.14/library/wave.html#wave.open), имеют следующие методы:5253#### `close()`5455Закрывает поток, если он был открыт с помощью `wave`, и делает экземпляр непригодным для использования. Автоматически вызывается при удалении объекта.5657#### `getnchannels()`5859Возвращает количество аудиоканалов (`1` для моно, `2` для стерео).6061#### `getsampwidth()`6263Возвращает ширину выборки в байтах.6465#### `getframerate()`6667Возвращает частоту дискретизации.6869#### `getnframes()`7071Возвращает количество аудиофреймов.7273#### `getcomptype()`7475Возвращает тип сжатия (поддерживается только тип `'NONE'`).7677#### `getcompname()`7879Человекочитаемая версия [`getcomptype()`](https://python-all.ru/3.14/library/wave.html#wave.Wave_read.getcomptype). Обычно `'not compressed'` соответствует `'NONE'`.8081#### `getparams()`8283Возвращает [`namedtuple()`](https://python-all.ru/3.14/library/collections.html#collections.namedtuple) `(nchannels, sampwidth, framerate, nframes, comptype, compname)`, эквивалентный результату методов `get*()`.8485#### `readframes(n)`8687Читает и возвращает не более *n* кадров аудио в виде объекта [`bytes`](https://python-all.ru/3.14/library/stdtypes.html#bytes).8889#### `rewind()`9091Перемещает указатель файла в начало аудиопотока.9293Следующие два метода определены для совместимости со старым модулем `aifc` и не делают ничего интересного.9495#### `getmarkers()`9697Возвращает `None`.9899Устарело с версии 3.13, будет удалено в версии 3.15: Метод существовал только для совместимости с модулем `aifc`, который был удалён в Python 3.13.100101#### `getmark(id)`102103Возбуждает исключение.104105Устарело с версии 3.13, будет удалено в версии 3.15: Метод существовал только для совместимости с модулем `aifc`, который был удалён в Python 3.13.106107Следующие два метода определяют термин «позиция», совместимый между ними, а в остальном зависящий от реализации.108109#### `setpos(pos)`110111Устанавливает указатель файла на указанную позицию.112113#### `tell()`114115Возвращает текущую позицию указателя файла.116117## Объекты Wave\_write118119#### `class wave.Wave_write`120121Записывает WAV-файл.122123Объекты Wave\_write, возвращаемые [`open()`](https://python-all.ru/3.14/library/wave.html#wave.open).124125Для потоков вывода с произвольным доступом заголовок `wave` будет автоматически обновлён, чтобы отражать фактически записанное количество кадров. Для потоков без произвольного доступа значение *nframes* должно быть точным на момент записи первых данных кадра. Точное значение *nframes* можно получить либо вызвав [`setnframes()`](https://python-all.ru/3.14/library/wave.html#wave.Wave_write.setnframes) или [`setparams()`](https://python-all.ru/3.14/library/wave.html#wave.Wave_write.setparams) с количеством кадров, которые будут записаны до вызова [`close()`](https://python-all.ru/3.14/library/wave.html#wave.Wave_write.close), а затем используя [`writeframesraw()`](https://python-all.ru/3.14/library/wave.html#wave.Wave_write.writeframesraw) для записи данных кадров, либо вызвав [`writeframes()`](https://python-all.ru/3.14/library/wave.html#wave.Wave_write.writeframes) со всеми записываемыми данными кадров. В последнем случае `writeframes()` вычислит количество кадров в данных и соответствующим образом установит *nframes* перед записью данных кадров.126127Изменено в версии 3.4: Добавлена поддержка файлов без произвольного доступа.128129Объекты Wave\_write имеют следующие методы:130131#### `close()`132133Убеждается, что *nframes* корректен, и закрывает файл, если он был открыт через `wave`. Этот метод вызывается при сборке объекта. Он возбудит исключение, если выходной поток не поддерживает произвольный доступ и *nframes* не совпадает с фактически записанным количеством кадров.134135#### `setnchannels(n)`136137Устанавливает количество каналов.138139#### `getnchannels()`140141Возвращает количество каналов.142143#### `setsampwidth(n)`144145Устанавливает ширину семпла равной *n* байт.146147#### `getsampwidth()`148149Возвращает ширину семпла в байтах.150151#### `setframerate(n)`152153Устанавливает частоту дискретизации равной *n*.154155Изменено в версии 3.2: Нецелочисленный входной аргумент этого метода округляется до ближайшего целого.156157#### `getframerate()`158159Возвращает частоту дискретизации.160161#### `setnframes(n)`162163Устанавливает количество кадров равным *n*. Впоследствии это значение может измениться, если фактически записанное количество кадров будет отличаться (при попытке обновить значение будет вызвана ошибка, если выходной поток не поддерживает произвольный доступ).164165#### `getnframes()`166167Возвращает количество аудиокадров, записанных на данный момент.168169#### `setcomptype(type, name)`170171Устанавливает тип сжатия и описание. На данный момент поддерживается только тип сжатия `NONE`, то есть без сжатия.172173#### `getcomptype()`174175Возвращает тип сжатия (`'NONE'`).176177#### `getcompname()`178179Возвращает читаемое человеком название типа сжатия.180181#### `setparams(tuple)`182183*tuple* (кортеж) должен быть `(nchannels, sampwidth, framerate, nframes, comptype, compname)` со значениями, допустимыми для методов `set*()`. Устанавливает все параметры.184185#### `getparams()`186187Возвращает [`namedtuple()`](https://python-all.ru/3.14/library/collections.html#collections.namedtuple) `(nchannels, sampwidth, framerate, nframes, comptype, compname)` , содержащий текущие выходные параметры.188189#### `tell()`190191Возвращает текущую позицию в файле с теми же оговорками, что и для методов [`Wave_read.tell()`](https://python-all.ru/3.14/library/wave.html#wave.Wave_read.tell) и [`Wave_read.setpos()`](https://python-all.ru/3.14/library/wave.html#wave.Wave_read.setpos).192193#### `writeframesraw(data)`194195Записывает аудиокадры без коррекции *nframes*.196197Изменено в версии 3.4: Теперь принимается любой [байтоподобный объект](https://python-all.ru/3.14/glossary.html#term-bytes-like-object).198199#### `writeframes(data)`200201Записывает аудиокадры и проверяет, что *nframes* корректен. Будет вызвана ошибка, если выходной поток не поддерживает произвольный доступ, а общее количество кадров, записанных после записи *data*, не совпадает с ранее установленным значением для *nframes*.202203Изменено в версии 3.4: Теперь принимается любой [байтоподобный объект](https://python-all.ru/3.14/glossary.html#term-bytes-like-object).204205Обратите внимание, что устанавливать какие-либо параметры после вызова `writeframes()` или [`writeframesraw()`](https://python-all.ru/3.14/library/wave.html#wave.Wave_write.writeframesraw) недопустимо; любая попытка сделать это приведёт к возникновению [`wave.Error`](https://python-all.ru/3.14/library/wave.html#wave.Error).206