2019-04-08 23:22:26 +08:00

1 line
10 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="body" role="main"><div class="section" id="module-chunk"><h1><span class="yiyi-st" id="yiyi-10">22.5. <a class="reference internal" href="#module-chunk" title="chunk: Module to read IFF chunks."><code class="xref py py-mod docutils literal"><span class="pre">chunk</span></code></a> - 读取IFF分块数据</span></h1><p><span class="yiyi-st" id="yiyi-11"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/chunk.py">Lib / chunk.py</a></span></p><p><span class="yiyi-st" id="yiyi-12">此模块提供用于读取使用EA IFF 85块的文件的接口。</span><span class="yiyi-st" id="yiyi-13"><a class="footnote-reference" href="#id2" id="id1">[1]</a>此格式至少用于音频交换文件格式AIFF / AIFF-C和真实媒体文件格式RMFF</span><span class="yiyi-st" id="yiyi-14">WAVE音频文件格式是密切相关的也可以使用此模块读取。</span></p><p><span class="yiyi-st" id="yiyi-15">块具有以下结构:</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-16">抵消</span></th><th class="head"><span class="yiyi-st" id="yiyi-17">长度</span></th><th class="head"><span class="yiyi-st" id="yiyi-18">内容</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-19">0</span></td><td><span class="yiyi-st" id="yiyi-20">4</span></td><td><span class="yiyi-st" id="yiyi-21">块ID</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-22">4</span></td><td><span class="yiyi-st" id="yiyi-23">4</span></td><td><span class="yiyi-st" id="yiyi-24">块大小按big-endian字节顺序不包括头</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-25">8</span></td><td><span class="yiyi-st" id="yiyi-26"><em>n</em></span></td><td><span class="yiyi-st" id="yiyi-27">数据字节,其中<em>n</em>是前面字段中给出的大小</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-28">8 + <em>n</em></span></td><td><span class="yiyi-st" id="yiyi-29">0或1</span></td><td><span class="yiyi-st" id="yiyi-30">如果<em>n</em>为奇数且使用块对齐,则需要填充字节</span></td></tr></tbody></table><p><span class="yiyi-st" id="yiyi-31">ID是一个4字节的字符串用于标识块的类型。</span></p><p><span class="yiyi-st" id="yiyi-32">大小字段32位值使用大端字节顺序编码给出了块数据的大小不包括8字节头。</span></p><p><span class="yiyi-st" id="yiyi-33">通常IFF类型的文件由一个或多个块组成。</span><span class="yiyi-st" id="yiyi-34">这里定义的<a class="reference internal" href="#chunk.Chunk" title="chunk.Chunk"><code class="xref py py-class docutils literal"><span class="pre">Chunk</span></code></a>类的建议用法是在每个块的开始处实例化一个实例,并从实例读取直到它到达结束,之后可以实例化一个新的实例。</span><span class="yiyi-st" id="yiyi-35">在文件结束时,创建新的实例将失败并出现<a class="reference internal" href="exceptions.html#EOFError" title="EOFError"><code class="xref py py-exc docutils literal"><span class="pre">EOFError</span></code></a>异常。</span></p><dl class="class"><dt id="chunk.Chunk"><span class="yiyi-st" id="yiyi-36"> <em class="property">class </em><code class="descclassname">chunk.</code><code class="descname">Chunk</code><span class="sig-paren">(</span><em>file</em>, <em>align=True</em>, <em>bigendian=True</em>, <em>inclheader=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-37">表示块的类。</span><span class="yiyi-st" id="yiyi-38"><em>文件</em>参数应为类文件对象。</span><span class="yiyi-st" id="yiyi-39">这个类的实例是特别允许的。</span><span class="yiyi-st" id="yiyi-40">唯一需要的方法是<code class="xref py py-meth docutils literal"><span class="pre">read()</span></code></span><span class="yiyi-st" id="yiyi-41">如果方法<a class="reference internal" href="io.html#io.IOBase.seek" title="io.IOBase.seek"><code class="xref py py-meth docutils literal"><span class="pre">seek()</span></code></a><a class="reference internal" href="io.html#io.IOBase.tell" title="io.IOBase.tell"><code class="xref py py-meth docutils literal"><span class="pre">tell()</span></code></a>存在,并且不引发异常,它们也被使用。</span><span class="yiyi-st" id="yiyi-42">如果这些方法存在并引发异常,它们将不会改变对象。</span><span class="yiyi-st" id="yiyi-43">如果可选参数<em>align</em>为真则假定块在2字节边界对齐。</span><span class="yiyi-st" id="yiyi-44">如果<em>align</em>为false则不进行对齐。</span><span class="yiyi-st" id="yiyi-45">默认值为true。</span><span class="yiyi-st" id="yiyi-46">如果可选参数<em>bigendian</em>为假,则块大小假定为小端顺序。</span><span class="yiyi-st" id="yiyi-47">这是WAVE音频文件所需要的。</span><span class="yiyi-st" id="yiyi-48">默认值为true。</span><span class="yiyi-st" id="yiyi-49">如果可选参数<em>inclheader</em>为真,则块头中给出的大小包括头的大小。</span><span class="yiyi-st" id="yiyi-50">默认值为false。</span></p><p><span class="yiyi-st" id="yiyi-51"><a class="reference internal" href="#chunk.Chunk" title="chunk.Chunk"><code class="xref py py-class docutils literal"><span class="pre">Chunk</span></code></a>对象支持以下方法:</span></p><dl class="method"><dt id="chunk.Chunk.getname"><span class="yiyi-st" id="yiyi-52"> <code class="descname">getname</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-53">返回块的名称ID</span><span class="yiyi-st" id="yiyi-54">这是块的前4个字节。</span></p></dd></dl><dl class="method"><dt id="chunk.Chunk.getsize"><span class="yiyi-st" id="yiyi-55"> <code class="descname">getsize</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-56">返回块的大小。</span></p></dd></dl><dl class="method"><dt id="chunk.Chunk.close"><span class="yiyi-st" id="yiyi-57"> <code class="descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-58">关闭并跳到块的结尾。</span><span class="yiyi-st" id="yiyi-59">这不会关闭底层文件。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-60">如果在<a class="reference internal" href="#chunk.Chunk.close" title="chunk.Chunk.close"><code class="xref py py-meth docutils literal"><span class="pre">close()</span></code></a>方法被调用后调用,剩余的方法将引发<a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a></span><span class="yiyi-st" id="yiyi-61">在Python 3.3之前,他们习惯于引发<a class="reference internal" href="exceptions.html#IOError" title="IOError"><code class="xref py py-exc docutils literal"><span class="pre">IOError</span></code></a>,现在是<a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a>的别名。</span></p><dl class="method"><dt id="chunk.Chunk.isatty"><span class="yiyi-st" id="yiyi-62"> <code class="descname">isatty</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-63">返回<code class="docutils literal"><span class="pre">False</span></code></span></p></dd></dl><dl class="method"><dt id="chunk.Chunk.seek"><span class="yiyi-st" id="yiyi-64"> <code class="descname">seek</code><span class="sig-paren">(</span><em>pos</em>, <em>whence=0</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-65">设置块的当前位置。</span><span class="yiyi-st" id="yiyi-66"><em>whence</em>参数是可选的,默认为<code class="docutils literal"><span class="pre">0</span></code>(绝对文件定位);其他值为<code class="docutils literal"><span class="pre">1</span></code>(相对于当前位置寻找)和<code class="docutils literal"><span class="pre">2</span></code>(相对于文件末尾寻找)。</span><span class="yiyi-st" id="yiyi-67">没有返回值。</span><span class="yiyi-st" id="yiyi-68">如果底层文件不允许seek只允许前向寻道。</span></p></dd></dl><dl class="method"><dt id="chunk.Chunk.tell"><span class="yiyi-st" id="yiyi-69"> <code class="descname">tell</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-70">将当前位置返回到块中。</span></p></dd></dl><dl class="method"><dt id="chunk.Chunk.read"><span class="yiyi-st" id="yiyi-71"> <code class="descname">read</code><span class="sig-paren">(</span><em>size=-1</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-72">从块中读取最多<em>size</em>个字节(如果读取在获取<em>大小</em>字节之前命中块的末尾,则减少)。</span><span class="yiyi-st" id="yiyi-73">如果<em>size</em>参数为负或省略,读取所有数据,直到块的结束。</span><span class="yiyi-st" id="yiyi-74">当立即遇到块的结尾时,返回一个空字节对象。</span></p></dd></dl><dl class="method"><dt id="chunk.Chunk.skip"><span class="yiyi-st" id="yiyi-75"> <code class="descname">skip</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-76">跳到块的结尾。</span><span class="yiyi-st" id="yiyi-77">所有对<a class="reference internal" href="#chunk.Chunk.read" title="chunk.Chunk.read"><code class="xref py py-meth docutils literal"><span class="pre">read()</span></code></a>的调用将返回<code class="docutils literal"><span class="pre">b''</span></code></span><span class="yiyi-st" id="yiyi-78">如果你对块的内容不感兴趣,应该调用这个方法,以便文件指向下一个块的开始。</span></p></dd></dl></dd></dl><p class="rubric"><span class="yiyi-st" id="yiyi-79">脚注</span></p><table class="docutils footnote" frame="void" id="id2" rules="none"><tbody valign="top"><tr><td class="label"><span class="yiyi-st" id="yiyi-80"><a class="fn-backref" href="#id1">[1]</a></span></td><td><span class="yiyi-st" id="yiyi-81">“EA IFF 85”交换格式文件标准Jerry MorrisonElectronic Arts1985年1月。</span></td></tr></tbody></table></div></div>