# 22.4. `wave` - 读取和写入WAV文件

源代码： Lib / wave.py

`wave`模块为WAV声音格式提供了一个方便的界面。它不支持压缩/解压缩，但它支持单声道/立体声。

`wave`模块定义了以下函数和异常：

`wave.``open`(file, mode=None)

  如果文件是字符串，请按该名称打开该文件，否则将其视为类文件对象。模式可以是：

  `'rb'`
    只读模式。
  `'wb'`
    只写模式。

  注意，它不允许读/写WAV文件。

  A mode of `'rb'` returns a `Wave_read` object, while a mode of `'wb'` returns a `Wave_write` object. 如果省略模式且类似文件的对象作为文件传递，则`file.mode`用作模式的默认值。

  如果传入类似文件的对象，当调用`close()`方法时，wave对象不会关闭它；它是调用者的责任关闭文件对象。

  `open()`函数可以在`with`语句中使用。当`with`块完成时，调用`Wave_read.close()`或`Wave_write.close()`方法。

  在版本3.4中更改：添加了对不可查看文件的支持。

`wave.``openfp`(file, mode)

  为维持向后兼容性的`open()`的同义词。

exception `wave.``Error`

  当某些内容不可能因为它违反了WAV规范或者遇到实现缺陷时出现的错误。

## 22.4.1. Wave_read Objects

由`open()`返回的Wave_read对象具有以下方法：

`Wave_read.``close`()

  如果流由`wave`打开，请关闭流，并使实例不可用。这在对象容器上自动调用。

`Wave_read.``getnchannels`()

  返回音频通道数（对于单声道，`1`，对于立体声，`2`）。

`Wave_read.``getsampwidth`()

  返回样本宽度（以字节为单位）。

`Wave_read.``getframerate`()

  返回采样频率。

`Wave_read.``getnframes`()

  返回音频帧数。

`Wave_read.``getcomptype`()

  返回压缩类型（`'NONE'`是唯一支持的类型）。

`Wave_read.``getcompname`()

  `getcomptype()`的人类可读版本。通常`'不是 压缩的` parallels `'NONE'`。

`Wave_read.``getparams`()

  传回`namedtuple()` `（nchannels， sampwidth， framerate， nframes， t7> comptype， compname）`，相当于`get*()`

`Wave_read.``readframes`(n)

  读取并返回最多n个音频帧，以字节为单位。

`Wave_read.``rewind`()

  将文件指针回滚到音频流的开头。

为了与`aifc`模块兼容，定义了以下两种方法，并且不执行任何有趣的操作。

`Wave_read.``getmarkers`()

  返回`None`。

`Wave_read.``getmark`(id)

  引发错误。

以下两种方法定义术语“位置”，它们之间是兼容的，否则是实现相关的。

`Wave_read.``setpos`(pos)

  将文件指针设置为指定位置。

`Wave_read.``tell`()

  返回当前文件指针位置。

## 22.4.2. Wave_write Objects

对于可寻找的输出流，`wave`头将自动更新以反映实际写入的帧数。对于不可搜索的流，在写入第一帧数据时，nframes值必须准确。通过调用`setnframes()`或`setparams()`可以实现精确的nframes值与`close()`，然后使用`writeframesraw()`写入帧数据，或者通过调用`writeframes()`在后一种情况下，`writeframes()`将在写入帧数据之前相应地计算数据中的帧数并设置nframes。

由`open()`返回的Wave_write对象具有以下方法：

在版本3.4中更改：添加了对不可查看文件的支持。

`Wave_write.``close`()

  请确保nframes正确，如果该文件已由`wave`打开，请关闭该文件。此方法在对象容器上调用。如果输出流不可寻址并且nframes与实际写入的帧数不匹配，它将引发异常。

`Wave_write.``setnchannels`(n)

  设置通道数。

`Wave_write.``setsampwidth`(n)

  将样本宽度设置为n个字节。

`Wave_write.``setframerate`(n)

  将帧速率设置为n。

  在版本3.2中更改：此方法的非积分输入四舍五入为最接近的整数。

`Wave_write.``setnframes`(n)

  将帧数设置为n。如果实际写入的帧数不同（如果输出流不可寻址，则此更新尝试将引发错误），这将稍后更改。

`Wave_write.``setcomptype`(type, name)

  设置压缩类型和描述。此时，仅支持压缩类型`NONE`，表示无压缩。

`Wave_write.``setparams`(tuple)

  元组应为`（nchannels， sampwidth， framerate， nframes， t5 > comptype， compname）`，其值适用于`set*()`设置所有参数。

`Wave_write.``tell`()

  返回文件中的当前位置，对`Wave_read.tell()`和`Wave_read.setpos()`方法使用相同的免责声明。

`Wave_write.``writeframesraw`(data)

  写入音频帧，而不更正nframes。

  在版本3.4中更改：现在接受任何bytes-like object。

`Wave_write.``writeframes`(data)

  写入音频帧，并确保nframes正确。如果输出流不可查找，并且在写入数据后已写入的帧总数与nframe的先前设置的值不匹配，则将引发错误。 。

  在版本3.4中更改：现在接受任何bytes-like object。

请注意，在调用`writeframes()`或`writeframesraw()`之后设置任何参数是无效的，任何尝试都会引发`wave.Error`