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