2019-04-21 11:50:48 +08:00

32 lines
47 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-lzma"><h1><span class="yiyi-st" id="yiyi-10">13.4. <a class="reference internal" href="#module-lzma" title="lzma: A Python wrapper for the liblzma compression library."><code class="xref py py-mod docutils literal"><span class="pre">lzma</span></code></a> - 使用LZMA算法进行压缩</span></h1><div class="versionadded"><p><span class="yiyi-st" id="yiyi-11"><span class="versionmodified">版本3.3中的新功能。</span></span></p></div><p><span class="yiyi-st" id="yiyi-12"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/lzma.py">Lib / lzma.py</a></span></p><p><span class="yiyi-st" id="yiyi-13">此模块提供类和便利功能用于使用LZMA压缩算法压缩和解压缩数据。</span><span class="yiyi-st" id="yiyi-14">还包括支持<strong class="program">xz</strong>实用程序使用的<code class="docutils literal"><span class="pre">.xz</span></code>和旧版<code class="docutils literal"><span class="pre">.lzma</span></code>文件格式以及原始压缩流的文件接口。</span></p><p><span class="yiyi-st" id="yiyi-15">该模块提供的接口与<a class="reference internal" href="bz2.html#module-bz2" title="bz2: Interfaces for bzip2 compression and decompression."><code class="xref py py-mod docutils literal"><span class="pre">bz2</span></code></a>模块的接口非常相似。</span><span class="yiyi-st" id="yiyi-16">但是,请注意,<a class="reference internal" href="#lzma.LZMAFile" title="lzma.LZMAFile"><code class="xref py py-class docutils literal"><span class="pre">LZMAFile</span></code></a><em>不是</em>线程安全,与<a class="reference internal" href="bz2.html#bz2.BZ2File" title="bz2.BZ2File"><code class="xref py py-class docutils literal"><span class="pre">bz2.BZ2File</span></code></a>不同,因此,如果您需要使用单个<a class="reference internal" href="#lzma.LZMAFile" title="lzma.LZMAFile"><code class="xref py py-class docutils literal"><span class="pre">LZMAFile</span></code></a></span></p><dl class="exception"><dt id="lzma.LZMAError"><span class="yiyi-st" id="yiyi-17"> <em class="property">exception </em><code class="descclassname">lzma.</code><code class="descname">LZMAError</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-18">当在压缩或解压缩期间或在初始化压缩器/解压缩器状态期间发生错误时引发此异常。</span></p></dd></dl><div class="section" id="reading-and-writing-compressed-files"><h2><span class="yiyi-st" id="yiyi-19">13.4.1. </span><span class="yiyi-st" id="yiyi-20">Reading and writing compressed files</span></h2><dl class="function"><dt id="lzma.open"><span class="yiyi-st" id="yiyi-21"> <code class="descclassname">lzma.</code><code class="descname">open</code><span class="sig-paren">(</span><em>filename</em>, <em>mode="rb"</em>, <em>*</em>, <em>format=None</em>, <em>check=-1</em>, <em>preset=None</em>, <em>filters=None</em>, <em>encoding=None</em>, <em>errors=None</em>, <em>newline=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-22">以二进制或文本模式打开LZMA压缩文件返回<a class="reference internal" href="../glossary.html#term-file-object"><span class="xref std std-term">file object</span></a></span></p><p><span class="yiyi-st" id="yiyi-23"><em>filename</em>参数可以是实际的文件名(给定为<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a><a class="reference internal" href="functions.html#bytes" title="bytes"><code class="xref py py-class docutils literal"><span class="pre">bytes</span></code></a>对象),在这种情况下,或者它可以是要读取或写入的现有文件对象。</span></p><p><span class="yiyi-st" id="yiyi-24">The <em>mode</em> argument can be any of <code class="docutils literal"><span class="pre">"r"</span></code>, <code class="docutils literal"><span class="pre">"rb"</span></code>, <code class="docutils literal"><span class="pre">"w"</span></code>, <code class="docutils literal"><span class="pre">"wb"</span></code>, <code class="docutils literal"><span class="pre">"x"</span></code>, <code class="docutils literal"><span class="pre">"xb"</span></code>, <code class="docutils literal"><span class="pre">"a"</span></code> or <code class="docutils literal"><span class="pre">"ab"</span></code> for binary mode, or <code class="docutils literal"><span class="pre">"rt"</span></code>, <code class="docutils literal"><span class="pre">"wt"</span></code>, <code class="docutils literal"><span class="pre">"xt"</span></code>, or <code class="docutils literal"><span class="pre">"at"</span></code> for text mode. </span><span class="yiyi-st" id="yiyi-25">默认值为<code class="docutils literal"><span class="pre">"rb"</span></code></span></p><p><span class="yiyi-st" id="yiyi-26">打开要读取的文件时,<em>格式</em><em>过滤器</em>参数与<a class="reference internal" href="#lzma.LZMADecompressor" title="lzma.LZMADecompressor"><code class="xref py py-class docutils literal"><span class="pre">LZMADecompressor</span></code></a>具有相同的含义。</span><span class="yiyi-st" id="yiyi-27">在这种情况下,不应使用<em>检查</em><em>预设</em>参数。</span></p><p><span class="yiyi-st" id="yiyi-28">打开要写入的文件时,<em>格式</em><em>检查</em><em>预设</em><em>过滤器</em> <a class="reference internal" href="#lzma.LZMACompressor" title="lzma.LZMACompressor"><code class="xref py py-class docutils literal"><span class="pre">LZMACompressor</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-29">对于二进制模式,此函数等效于<a class="reference internal" href="#lzma.LZMAFile" title="lzma.LZMAFile"><code class="xref py py-class docutils literal"><span class="pre">LZMAFile</span></code></a>构造函数:<code class="docutils literal"><span class="pre">LZMAFilefilename</span> <span class="pre">mode</span> <span class="pre">... </span></code></span><span class="yiyi-st" id="yiyi-30">在这种情况下,不能提供<em>编码</em><em>错误</em><em>新行</em>参数。</span></p><p><span class="yiyi-st" id="yiyi-31">对于文本模式,将创建一个<a class="reference internal" href="#lzma.LZMAFile" title="lzma.LZMAFile"><code class="xref py py-class docutils literal"><span class="pre">LZMAFile</span></code></a>对象,并将其包装在具有指定编码,错误处理行为和行结尾的<a class="reference internal" href="io.html#io.TextIOWrapper" title="io.TextIOWrapper"><code class="xref py py-class docutils literal"><span class="pre">io.TextIOWrapper</span></code></a>实例中。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-32"><span class="versionmodified">在版本3.4中更改:</span>添加对<code class="docutils literal"><span class="pre">"x"</span></code><code class="docutils literal"><span class="pre">"xb"</span></code><code class="docutils literal"><span class="pre">"xt"</span></code>模式的支持。</span></p></div></dd></dl><dl class="class"><dt id="lzma.LZMAFile"><span class="yiyi-st" id="yiyi-33"> <em class="property">class </em><code class="descclassname">lzma.</code><code class="descname">LZMAFile</code><span class="sig-paren">(</span><em>filename=None</em>, <em>mode="r"</em>, <em>*</em>, <em>format=None</em>, <em>check=-1</em>, <em>preset=None</em>, <em>filters=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-34">以二进制模式打开LZMA压缩文件。</span></p><p><span class="yiyi-st" id="yiyi-35"><a class="reference internal" href="#lzma.LZMAFile" title="lzma.LZMAFile"><code class="xref py py-class docutils literal"><span class="pre">LZMAFile</span></code></a>可以包装已打开的<a class="reference internal" href="../glossary.html#term-file-object"><span class="xref std std-term">file object</span></a>,或直接在命名文件上操作。</span><span class="yiyi-st" id="yiyi-36"><em>filename</em>参数指定要打开的文件对象或要打开的文件的名称(作为<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a><a class="reference internal" href="functions.html#bytes" title="bytes"><code class="xref py py-class docutils literal"><span class="pre">bytes</span></code></a>对象)。</span><span class="yiyi-st" id="yiyi-37">当包装现有文件对象时,当<a class="reference internal" href="#lzma.LZMAFile" title="lzma.LZMAFile"><code class="xref py py-class docutils literal"><span class="pre">LZMAFile</span></code></a>关闭时,包装文件不会关闭。</span></p><p><span class="yiyi-st" id="yiyi-38">The <em>mode</em> argument can be either <code class="docutils literal"><span class="pre">"r"</span></code> for reading (default), <code class="docutils literal"><span class="pre">"w"</span></code> for overwriting, <code class="docutils literal"><span class="pre">"x"</span></code> for exclusive creation, or <code class="docutils literal"><span class="pre">"a"</span></code> for appending. </span><span class="yiyi-st" id="yiyi-39">这些可以等效地分别给出为<code class="docutils literal"><span class="pre">"rb"</span></code><code class="docutils literal"><span class="pre">"wb"</span></code><code class="docutils literal"><span class="pre">"xb"</span></code><code class="docutils literal"><span class="pre">"ab"</span></code></span></p><p><span class="yiyi-st" id="yiyi-40">If <em>filename</em> is a file object (rather than an actual file name), a mode of <code class="docutils literal"><span class="pre">"w"</span></code> does not truncate the file, and is instead equivalent to <code class="docutils literal"><span class="pre">"a"</span></code>.</span></p><p><span class="yiyi-st" id="yiyi-41">当打开用于读取的文件时,输入文件可以是多个单独的压缩流的级联。</span><span class="yiyi-st" id="yiyi-42">这些被透明地解码为单个逻辑流。</span></p><p><span class="yiyi-st" id="yiyi-43">打开要读取的文件时,<em>格式</em><em>过滤器</em>参数与<a class="reference internal" href="#lzma.LZMADecompressor" title="lzma.LZMADecompressor"><code class="xref py py-class docutils literal"><span class="pre">LZMADecompressor</span></code></a>具有相同的含义。</span><span class="yiyi-st" id="yiyi-44">在这种情况下,不应使用<em>检查</em><em>预设</em>参数。</span></p><p><span class="yiyi-st" id="yiyi-45">打开要写入的文件时,<em>格式</em><em>检查</em><em>预设</em><em>过滤器</em> <a class="reference internal" href="#lzma.LZMACompressor" title="lzma.LZMACompressor"><code class="xref py py-class docutils literal"><span class="pre">LZMACompressor</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-46"><a class="reference internal" href="#lzma.LZMAFile" title="lzma.LZMAFile"><code class="xref py py-class docutils literal"><span class="pre">LZMAFile</span></code></a>支持<a class="reference internal" href="io.html#io.BufferedIOBase" title="io.BufferedIOBase"><code class="xref py py-class docutils literal"><span class="pre">io.BufferedIOBase</span></code></a>指定的所有成员,但<code class="xref py py-meth docutils literal"><span class="pre">detach()</span></code><code class="xref py py-meth docutils literal"><span class="pre">truncate()</span></code>除外。</span><span class="yiyi-st" id="yiyi-47">支持迭代和<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal"><span class="pre">with</span></code></a>语句。</span></p><p><span class="yiyi-st" id="yiyi-48">还提供以下方法:</span></p><dl class="method"><dt id="lzma.LZMAFile.peek"><span class="yiyi-st" id="yiyi-49"> <code class="descname">peek</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-50">返回缓冲数据,而不提前文件位置。</span><span class="yiyi-st" id="yiyi-51">将返回至少一个字节的数据除非已达到EOF。</span><span class="yiyi-st" id="yiyi-52">返回的确切字节数未指定(忽略<em>size</em>参数)。</span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-53">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-54">调用<a class="reference internal" href="#lzma.LZMAFile.peek" title="lzma.LZMAFile.peek"><code class="xref py py-meth docutils literal"><span class="pre">peek()</span></code></a>不会更改<a class="reference internal" href="#lzma.LZMAFile" title="lzma.LZMAFile"><code class="xref py py-class docutils literal"><span class="pre">LZMAFile</span></code></a>的文件位置,它可能会更改底层文件对象的位置。</span><span class="yiyi-st" id="yiyi-55">如果<a class="reference internal" href="#lzma.LZMAFile" title="lzma.LZMAFile"><code class="xref py py-class docutils literal"><span class="pre">LZMAFile</span></code></a>是通过传递<em>filename</em>的文件对象构建的)。</span></p></div></dd></dl><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-56"><span class="versionmodified">在版本3.4中已更改:</span>添加了对<code class="docutils literal"><span class="pre">"x"</span></code><code class="docutils literal"><span class="pre">"xb"</span></code>模式的支持。</span></p></div><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-57"><span class="versionmodified">在版本3.5中更改:</span> <a class="reference internal" href="io.html#io.BufferedIOBase.read" title="io.BufferedIOBase.read"><code class="xref py py-meth docutils literal"><span class="pre">read()</span></code></a>方法现在接受<code class="docutils literal"><span class="pre">None</span></code>的参数。</span></p></div></dd></dl></div><div class="section" id="compressing-and-decompressing-data-in-memory"><h2><span class="yiyi-st" id="yiyi-58">13.4.2. </span><span class="yiyi-st" id="yiyi-59">Compressing and decompressing data in memory</span></h2><dl class="class"><dt id="lzma.LZMACompressor"><span class="yiyi-st" id="yiyi-60"> <em class="property">class </em><code class="descclassname">lzma.</code><code class="descname">LZMACompressor</code><span class="sig-paren">(</span><em>format=FORMAT_XZ</em>, <em>check=-1</em>, <em>preset=None</em>, <em>filters=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-61">创建压缩器对象,可用于逐步压缩数据。</span></p><p><span class="yiyi-st" id="yiyi-62">有关压缩单个数据块的更方便的方法,请参见<a class="reference internal" href="#lzma.compress" title="lzma.compress"><code class="xref py py-func docutils literal"><span class="pre">compress()</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-63"><em>格式</em>参数指定应使用哪种容器格式。</span><span class="yiyi-st" id="yiyi-64">可能的值有:</span></p><ul><li><dl class="first docutils"><dt><span class="yiyi-st" id="yiyi-65"><code class="xref py py-const docutils literal"><span class="pre">FORMAT_XZ</span></code><code class="docutils literal"><span class="pre">.xz</span></code>容器格式。</span></dt><dd><p class="first last"><span class="yiyi-st" id="yiyi-66">这是默认格式。</span></p></dd></dl></li><li><dl class="first docutils"><dt><span class="yiyi-st" id="yiyi-67"><code class="xref py py-const docutils literal"><span class="pre">FORMAT_ALONE</span></code>:旧版<code class="docutils literal"><span class="pre">.lzma</span></code>容器格式。</span></dt><dd><p class="first last"><span class="yiyi-st" id="yiyi-68">此格式比<code class="docutils literal"><span class="pre">.xz</span></code>更受限制 - 它不支持完整性检查或多个过滤器。</span></p></dd></dl></li><li><dl class="first docutils"><dt><span class="yiyi-st" id="yiyi-69"><code class="xref py py-const docutils literal"><span class="pre">FORMAT_RAW</span></code>:原始数据流,不使用任何容器格式。</span></dt><dd><p class="first last"><span class="yiyi-st" id="yiyi-70">此格式说明符不支持完整性检查,并要求您始终指定自定义过滤器链(用于压缩和解压缩)。</span><span class="yiyi-st" id="yiyi-71">此外,以这种方式压缩的数据不能使用<code class="xref py py-const docutils literal"><span class="pre">FORMAT_AUTO</span></code>解压缩(请参阅<a class="reference internal" href="#lzma.LZMADecompressor" title="lzma.LZMADecompressor"><code class="xref py py-class docutils literal"><span class="pre">LZMADecompressor</span></code></a>)。</span></p></dd></dl></li></ul><p><span class="yiyi-st" id="yiyi-72"><em>check</em>参数指定要包括在压缩数据中的完整性检查的类型。</span><span class="yiyi-st" id="yiyi-73">此检查用于解压缩时,以确保数据未被损坏。</span><span class="yiyi-st" id="yiyi-74">可能的值有:</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-75"><code class="xref py py-const docutils literal"><span class="pre">CHECK_NONE</span></code>:无完整性检查。</span><span class="yiyi-st" id="yiyi-76">这是<code class="xref py py-const docutils literal"><span class="pre">FORMAT_ALONE</span></code><code class="xref py py-const docutils literal"><span class="pre">FORMAT_RAW</span></code>的默认(且唯一可接受的值)。</span></li><li><span class="yiyi-st" id="yiyi-77"><code class="xref py py-const docutils literal"><span class="pre">CHECK_CRC32</span></code>32位循环冗余校验。</span></li><li><span class="yiyi-st" id="yiyi-78"><code class="xref py py-const docutils literal"><span class="pre">CHECK_CRC64</span></code>64位循环冗余校验。</span><span class="yiyi-st" id="yiyi-79">这是<code class="xref py py-const docutils literal"><span class="pre">FORMAT_XZ</span></code>的默认值。</span></li><li><span class="yiyi-st" id="yiyi-80"><code class="xref py py-const docutils literal"><span class="pre">CHECK_SHA256</span></code>256位安全散列算法。</span></li></ul><p><span class="yiyi-st" id="yiyi-81">如果不支持指定的检查,则会引发<a class="reference internal" href="#lzma.LZMAError" title="lzma.LZMAError"><code class="xref py py-class docutils literal"><span class="pre">LZMAError</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-82">压缩设置可以指定为预设压缩级别(使用<em>预设</em>参数),也可以详细指定为自定义过滤器链(使用<em>过滤器</em>参数)。</span></p><p><span class="yiyi-st" id="yiyi-83"><em>预设</em>参数(如果提供)应为<code class="docutils literal"><span class="pre">0</span></code><code class="docutils literal"><span class="pre">9</span></code>(含)之间的整数,可选择与常数<code class="xref py py-const docutils literal"><span class="pre">PRESET_EXTREME</span></code></span><span class="yiyi-st" id="yiyi-84">If neither <em>preset</em> nor <em>filters</em> are given, the default behavior is to use <code class="xref py py-const docutils literal"><span class="pre">PRESET_DEFAULT</span></code> (preset level <code class="docutils literal"><span class="pre">6</span></code>). </span><span class="yiyi-st" id="yiyi-85">较高的预设产生较小的输出,但使压缩过程较慢。</span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-86">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-87">除了更多的CPU密集具有更高预设的压缩还需要更多的内存并产生需要更多内存来解压缩的输出</span><span class="yiyi-st" id="yiyi-88">例如,使用预设<code class="docutils literal"><span class="pre">9</span></code><a class="reference internal" href="#lzma.LZMACompressor" title="lzma.LZMACompressor"><code class="xref py py-class docutils literal"><span class="pre">LZMACompressor</span></code></a>对象的开销可能高达800 MiB。</span><span class="yiyi-st" id="yiyi-89">因此,通常最好坚持使用默认预设。</span></p></div><p><span class="yiyi-st" id="yiyi-90"><em>过滤器</em>参数(如果提供)应为过滤器链说明符。</span><span class="yiyi-st" id="yiyi-91">有关详细信息,请参见<a class="reference internal" href="#filter-chain-specs"><span>Specifying custom filter chains</span></a></span></p><dl class="method"><dt id="lzma.LZMACompressor.compress"><span class="yiyi-st" id="yiyi-92"> <code class="descname">compress</code><span class="sig-paren">(</span><em>data</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-93">压缩<em>数据</em>a <a class="reference internal" href="functions.html#bytes" title="bytes"><code class="xref py py-class docutils literal"><span class="pre">bytes</span></code></a>对象),返回包含至少部分输入的压缩数据的<a class="reference internal" href="functions.html#bytes" title="bytes"><code class="xref py py-class docutils literal"><span class="pre">bytes</span></code></a>对象。</span><span class="yiyi-st" id="yiyi-94">一些<em>数据</em>可以在内部缓冲,用于稍后调用<a class="reference internal" href="#lzma.compress" title="lzma.compress"><code class="xref py py-meth docutils literal"><span class="pre">compress()</span></code></a><a class="reference internal" href="#lzma.LZMACompressor.flush" title="lzma.LZMACompressor.flush"><code class="xref py py-meth docutils literal"><span class="pre">flush()</span></code></a></span><span class="yiyi-st" id="yiyi-95">返回的数据应与之前对<a class="reference internal" href="#lzma.compress" title="lzma.compress"><code class="xref py py-meth docutils literal"><span class="pre">compress()</span></code></a>的任何调用的输出连接。</span></p></dd></dl><dl class="method"><dt id="lzma.LZMACompressor.flush"><span class="yiyi-st" id="yiyi-96"> <code class="descname">flush</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-97">完成压缩过程,返回一个包含存储在压缩器内部缓冲区中的任何数据的<a class="reference internal" href="functions.html#bytes" title="bytes"><code class="xref py py-class docutils literal"><span class="pre">bytes</span></code></a>对象。</span></p><p><span class="yiyi-st" id="yiyi-98">在调用此方法后,无法使用压缩器。</span></p></dd></dl></dd></dl><dl class="class"><dt id="lzma.LZMADecompressor"><span class="yiyi-st" id="yiyi-99"> <em class="property">class </em><code class="descclassname">lzma.</code><code class="descname">LZMADecompressor</code><span class="sig-paren">(</span><em>format=FORMAT_AUTO</em>, <em>memlimit=None</em>, <em>filters=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-100">创建解压缩器对象,可用于逐步解压缩数据。</span></p><p><span class="yiyi-st" id="yiyi-101">有关一次解压缩整个压缩流的更方便的方法,请参阅<a class="reference internal" href="#lzma.decompress" title="lzma.decompress"><code class="xref py py-func docutils literal"><span class="pre">decompress()</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-102"><em>格式</em>参数指定应使用的容器格式。</span><span class="yiyi-st" id="yiyi-103">默认值为<code class="xref py py-const docutils literal"><span class="pre">FORMAT_AUTO</span></code>,它可以解压缩<code class="docutils literal"><span class="pre">.xz</span></code><code class="docutils literal"><span class="pre">.lzma</span></code>文件。</span><span class="yiyi-st" id="yiyi-104">其他可能的值包括<code class="xref py py-const docutils literal"><span class="pre">FORMAT_XZ</span></code><code class="xref py py-const docutils literal"><span class="pre">FORMAT_ALONE</span></code><code class="xref py py-const docutils literal"><span class="pre">FORMAT_RAW</span></code></span></p><p><span class="yiyi-st" id="yiyi-105"><em>memlimit</em>参数指定解压缩程序可以使用的内存量的限制(以字节为单位)。</span><span class="yiyi-st" id="yiyi-106">使用此参数时,如果无法在给定的内存限制内解压缩输入,则解压缩将失败并使用<a class="reference internal" href="#lzma.LZMAError" title="lzma.LZMAError"><code class="xref py py-class docutils literal"><span class="pre">LZMAError</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-107"><em>filters</em>参数指定用于创建要解压缩的流的过滤器链。</span><span class="yiyi-st" id="yiyi-108">如果<em>格式</em><code class="xref py py-const docutils literal"><span class="pre">FORMAT_RAW</span></code>,则此参数是必需的,但不应用于其他格式。</span><span class="yiyi-st" id="yiyi-109">有关过滤器链的详细信息,请参见<a class="reference internal" href="#filter-chain-specs"><span>Specifying custom filter chains</span></a></span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-110">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-111"><a class="reference internal" href="#lzma.decompress" title="lzma.decompress"><code class="xref py py-func docutils literal"><span class="pre">decompress()</span></code></a><a class="reference internal" href="#lzma.LZMAFile" title="lzma.LZMAFile"><code class="xref py py-class docutils literal"><span class="pre">LZMAFile</span></code></a>不同,此类不透明地处理包含多个压缩流的输入。</span><span class="yiyi-st" id="yiyi-112">要使用<a class="reference internal" href="#lzma.LZMADecompressor" title="lzma.LZMADecompressor"><code class="xref py py-class docutils literal"><span class="pre">LZMADecompressor</span></code></a>解压缩多流输入,必须为每个流创建一个新的解压缩器。</span></p></div><dl class="method"><dt id="lzma.LZMADecompressor.decompress"><span class="yiyi-st" id="yiyi-113"> <code class="descname">decompress</code><span class="sig-paren">(</span><em>data</em>, <em>max_length=-1</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-114">解压缩<em>数据</em>a <a class="reference internal" href="../glossary.html#term-bytes-like-object"><span class="xref std std-term">bytes-like object</span></a>),以字节形式返回未压缩数据。</span><span class="yiyi-st" id="yiyi-115">一些<em>数据</em>可以在内部缓冲,以便稍后调用<a class="reference internal" href="#lzma.decompress" title="lzma.decompress"><code class="xref py py-meth docutils literal"><span class="pre">decompress()</span></code></a></span><span class="yiyi-st" id="yiyi-116">返回的数据应与之前对<a class="reference internal" href="#lzma.decompress" title="lzma.decompress"><code class="xref py py-meth docutils literal"><span class="pre">decompress()</span></code></a>的任何调用的输出连接。</span></p><p><span class="yiyi-st" id="yiyi-117">如果<em>max_length</em>为非负数,则返回至多<em>max_length</em>字节的解压缩数据。</span><span class="yiyi-st" id="yiyi-118">如果达到此限制并且可以产生进一步输出,则<a class="reference internal" href="#lzma.LZMADecompressor.needs_input" title="lzma.LZMADecompressor.needs_input"><code class="xref py py-attr docutils literal"><span class="pre">needs_input</span></code></a>属性将设置为<code class="docutils literal"><span class="pre">False</span></code></span><span class="yiyi-st" id="yiyi-119">在这种情况下,对<a class="reference internal" href="#lzma.LZMADecompressor.decompress" title="lzma.LZMADecompressor.decompress"><code class="xref py py-meth docutils literal"><span class="pre">decompress()</span></code></a>的下一个调用可以提供<em>数据</em>作为<code class="docutils literal"><span class="pre">b''</span></code>以获得更多的输出。</span></p><p><span class="yiyi-st" id="yiyi-120">如果所有输入数据都解压缩并返回(因为它小于<em>max_length</em>字节,或因为<em>max_length</em>为负数),则<a class="reference internal" href="#lzma.LZMADecompressor.needs_input" title="lzma.LZMADecompressor.needs_input"><code class="xref py py-attr docutils literal"><span class="pre">needs_input</span></code></a>属性将设置为<code class="docutils literal"><span class="pre">True</span></code></span></p><p><span class="yiyi-st" id="yiyi-121">在流到达结束后尝试解压缩数据引发<cite>EOFError</cite></span><span class="yiyi-st" id="yiyi-122">在流结束后找到的任何数据都将被忽略,并保存在<a class="reference internal" href="#lzma.LZMADecompressor.unused_data" title="lzma.LZMADecompressor.unused_data"><code class="xref py py-attr docutils literal"><span class="pre">unused_data</span></code></a>属性中。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-123"><span class="versionmodified">在版本3.5中已更改:</span>添加了<em>max_length</em>参数。</span></p></div></dd></dl><dl class="attribute"><dt id="lzma.LZMADecompressor.check"><span class="yiyi-st" id="yiyi-124"> <code class="descname">check</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-125">输入流使用的完整性检查的ID。</span><span class="yiyi-st" id="yiyi-126">这可以是<code class="xref py py-const docutils literal"><span class="pre">CHECK_UNKNOWN</span></code>,直到足够的输入已经被解码以确定它使用什么完整性检查。</span></p></dd></dl><dl class="attribute"><dt id="lzma.LZMADecompressor.eof"><span class="yiyi-st" id="yiyi-127"> <code class="descname">eof</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-128"><code class="docutils literal"><span class="pre">True</span></code>如果已达到流结束标记。</span></p></dd></dl><dl class="attribute"><dt id="lzma.LZMADecompressor.unused_data"><span class="yiyi-st" id="yiyi-129"> <code class="descname">unused_data</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-130">压缩流结束后找到的数据。</span></p><p><span class="yiyi-st" id="yiyi-131">在到达流的结束之前,这将是<code class="docutils literal"><span class="pre">b""</span></code></span></p></dd></dl><dl class="attribute"><dt id="lzma.LZMADecompressor.needs_input"><span class="yiyi-st" id="yiyi-132"> <code class="descname">needs_input</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-133"><code class="docutils literal"><span class="pre">False</span></code>如果<a class="reference internal" href="#lzma.LZMADecompressor.decompress" title="lzma.LZMADecompressor.decompress"><code class="xref py py-meth docutils literal"><span class="pre">decompress()</span></code></a>方法可以在需要新的未压缩输入之前提供更多解压缩数据。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-134"><span class="versionmodified">版本3.5中的新功能。</span></span></p></div></dd></dl></dd></dl><dl class="function"><dt id="lzma.compress"><span class="yiyi-st" id="yiyi-135"> <code class="descclassname">lzma.</code><code class="descname">compress</code><span class="sig-paren">(</span><em>data</em>, <em>format=FORMAT_XZ</em>, <em>check=-1</em>, <em>preset=None</em>, <em>filters=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-136">压缩<em>数据</em>a <a class="reference internal" href="functions.html#bytes" title="bytes"><code class="xref py py-class docutils literal"><span class="pre">bytes</span></code></a>对象),将压缩数据作为<a class="reference internal" href="functions.html#bytes" title="bytes"><code class="xref py py-class docutils literal"><span class="pre">bytes</span></code></a>对象返回。</span></p><p><span class="yiyi-st" id="yiyi-137">有关<em>格式</em><em>检查</em><em>预设</em><em>过滤器</em>的说明,请参阅上述<a class="reference internal" href="#lzma.LZMACompressor" title="lzma.LZMACompressor"><code class="xref py py-class docutils literal"><span class="pre">LZMACompressor</span></code></a>参数。</span></p></dd></dl><dl class="function"><dt id="lzma.decompress"><span class="yiyi-st" id="yiyi-138"> <code class="descclassname">lzma.</code><code class="descname">decompress</code><span class="sig-paren">(</span><em>data</em>, <em>format=FORMAT_AUTO</em>, <em>memlimit=None</em>, <em>filters=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-139">解压缩<em>数据</em>a <a class="reference internal" href="functions.html#bytes" title="bytes"><code class="xref py py-class docutils literal"><span class="pre">bytes</span></code></a>对象),将未压缩数据作为<a class="reference internal" href="functions.html#bytes" title="bytes"><code class="xref py py-class docutils literal"><span class="pre">bytes</span></code></a>对象返回。</span></p><p><span class="yiyi-st" id="yiyi-140">如果<em>data</em>是多个不同压缩流的并置,解压缩所有这些流,并返回结果的并置。</span></p><p><span class="yiyi-st" id="yiyi-141">有关<em>格式</em><em>memlimit</em><em>过滤器</em>参数的说明,请参见上述<a class="reference internal" href="#lzma.LZMADecompressor" title="lzma.LZMADecompressor"><code class="xref py py-class docutils literal"><span class="pre">LZMADecompressor</span></code></a></span></p></dd></dl></div><div class="section" id="miscellaneous"><h2><span class="yiyi-st" id="yiyi-142">13.4.3. </span><span class="yiyi-st" id="yiyi-143">Miscellaneous</span></h2><dl class="function"><dt id="lzma.is_check_supported"><span class="yiyi-st" id="yiyi-144"> <code class="descclassname">lzma.</code><code class="descname">is_check_supported</code><span class="sig-paren">(</span><em>check</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-145">如果在此系统上支持给定的完整性检查则返回true。</span></p><p><span class="yiyi-st" id="yiyi-146">始终支持<code class="xref py py-const docutils literal"><span class="pre">CHECK_NONE</span></code><code class="xref py py-const docutils literal"><span class="pre">CHECK_CRC32</span></code></span><span class="yiyi-st" id="yiyi-147">如果您使用的是使用有限功能集编译的<strong class="program">liblzma</strong>版本,则<code class="xref py py-const docutils literal"><span class="pre">CHECK_CRC64</span></code><code class="xref py py-const docutils literal"><span class="pre">CHECK_SHA256</span></code>可能无法使用。</span></p></dd></dl></div><div class="section" id="specifying-custom-filter-chains"><h2><span class="yiyi-st" id="yiyi-148">13.4.4. </span><span class="yiyi-st" id="yiyi-149">Specifying custom filter chains</span></h2><p><span class="yiyi-st" id="yiyi-150">过滤器链说明符是字典序列其中每个字典包含单个过滤器的ID和选项。</span><span class="yiyi-st" id="yiyi-151">每个字典必须包含键<code class="docutils literal"><span class="pre">"id"</span></code>,并且可以包含用于指定过滤器相关选项的其他键。</span><span class="yiyi-st" id="yiyi-152">有效的过滤器ID如下</span></p><ul><li><dl class="first docutils"><dt><span class="yiyi-st" id="yiyi-153">压缩过滤器:</span></dt><dd><ul class="first last simple"><li><span class="yiyi-st" id="yiyi-154"><code class="xref py py-const docutils literal"><span class="pre">FILTER_LZMA1</span></code>(用于<code class="xref py py-const docutils literal"><span class="pre">FORMAT_ALONE</span></code></span></li><li><span class="yiyi-st" id="yiyi-155"><code class="xref py py-const docutils literal"><span class="pre">FILTER_LZMA2</span></code>(用于<code class="xref py py-const docutils literal"><span class="pre">FORMAT_XZ</span></code><code class="xref py py-const docutils literal"><span class="pre">FORMAT_RAW</span></code></span></li></ul></dd></dl></li><li><dl class="first docutils"><dt><span class="yiyi-st" id="yiyi-156">Delta滤波器</span></dt><dd><ul class="first last simple"><li><span class="yiyi-st" id="yiyi-157"><code class="xref py py-const docutils literal"><span class="pre">FILTER_DELTA</span></code></span></li></ul></dd></dl></li><li><dl class="first docutils"><dt><span class="yiyi-st" id="yiyi-158">分支呼叫跳转BCJ过滤器</span></dt><dd><ul class="first last simple"><li><span class="yiyi-st" id="yiyi-159"><code class="xref py py-const docutils literal"><span class="pre">FILTER_X86</span></code></span></li><li><span class="yiyi-st" id="yiyi-160"><code class="xref py py-const docutils literal"><span class="pre">FILTER_IA64</span></code></span></li><li><span class="yiyi-st" id="yiyi-161"><code class="xref py py-const docutils literal"><span class="pre">FILTER_ARM</span></code></span></li><li><span class="yiyi-st" id="yiyi-162"><code class="xref py py-const docutils literal"><span class="pre">FILTER_ARMTHUMB</span></code></span></li><li><span class="yiyi-st" id="yiyi-163"><code class="xref py py-const docutils literal"><span class="pre">FILTER_POWERPC</span></code></span></li><li><span class="yiyi-st" id="yiyi-164"><code class="xref py py-const docutils literal"><span class="pre">FILTER_SPARC</span></code></span></li></ul></dd></dl></li></ul><p><span class="yiyi-st" id="yiyi-165">过滤器链最多可包含4个过滤器且不能为空。</span><span class="yiyi-st" id="yiyi-166">链中的最后一个过滤器必须是压缩过滤器并且任何其他过滤器必须是delta或BCJ过滤器。</span></p><p><span class="yiyi-st" id="yiyi-167">压缩过滤器支持以下选项(在字典中表示过滤器的附加条目):</span></p><span class="yiyi-st" id="yiyi-178"> <blockquote> <div><ul class="simple"> <li><code class="docutils literal"><span class="pre">preset</span></code>: A compression preset to use as a source of default values for options that are not specified explicitly.</li> <li><code class="docutils literal"><span class="pre">dict_size</span></code>: Dictionary size in bytes. This should be between 4 KiB and 1.5 GiB (inclusive).</li> <li><code class="docutils literal"><span class="pre">lc</span></code>: Number of literal context bits.</li> <li><code class="docutils literal"><span class="pre">lp</span></code>: Number of literal position bits. The sum <code class="docutils literal"><span class="pre">lc</span> <span class="pre">+</span> <span class="pre">lp</span></code> must be at most 4.</li> <li><code class="docutils literal"><span class="pre">pb</span></code>: Number of position bits; must be at most 4.</li> <li><code class="docutils literal"><span class="pre">mode</span></code>: <code class="xref py py-const docutils literal"><span class="pre">MODE_FAST</span></code> or <code class="xref py py-const docutils literal"><span class="pre">MODE_NORMAL</span></code>.</li> <li><code class="docutils literal"><span class="pre">nice_len</span></code>: What should be considered a “nice length” for a match. This should be 273 or less.</li> <li><code class="docutils literal"><span class="pre">mf</span></code>: What match finder to use <code class="xref py py-const docutils literal"><span class="pre">MF_HC3</span></code>, <code class="xref py py-const docutils literal"><span class="pre">MF_HC4</span></code>, <code class="xref py py-const docutils literal"><span class="pre">MF_BT2</span></code>, <code class="xref py py-const docutils literal"><span class="pre">MF_BT3</span></code>, or <code class="xref py py-const docutils literal"><span class="pre">MF_BT4</span></code>.</li> <li><code class="docutils literal"><span class="pre">depth</span></code>: Maximum search depth used by match finder. 0 (default) means to select automatically based on other filter options.</li> </ul> </div></blockquote></span><p><span class="yiyi-st" id="yiyi-168">增量滤波器存储字节之间的差异,在某些情况下为压缩器产生更多的重复输入。</span><span class="yiyi-st" id="yiyi-169">它只支持单个增量过滤器只支持一个选项<code class="docutils literal"><span class="pre">dist</span></code></span><span class="yiyi-st" id="yiyi-170">这指示要减去的字节之间的距离。</span><span class="yiyi-st" id="yiyi-171">默认值为1</span><span class="yiyi-st" id="yiyi-172">取相邻字节之间的差异。</span></p><p><span class="yiyi-st" id="yiyi-173">BCJ过滤器旨在应用于机器代码。</span><span class="yiyi-st" id="yiyi-174">它们转换代码中的相对分支,调用和跳转以使用绝对寻址,目的是增加压缩器可利用的冗余。</span><span class="yiyi-st" id="yiyi-175">这些过滤器支持一个选项,<code class="docutils literal"><span class="pre">start_offset</span></code></span><span class="yiyi-st" id="yiyi-176">它指定应映射到输入数据开头的地址。</span><span class="yiyi-st" id="yiyi-177">默认值为0。</span></p></div><div class="section" id="examples"><h2><span class="yiyi-st" id="yiyi-179">13.4.5. </span><span class="yiyi-st" id="yiyi-180">Examples</span></h2><p><span class="yiyi-st" id="yiyi-181">在压缩文件中读取:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">lzma</span>
<span class="k">with</span> <span class="n">lzma</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">"file.xz"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">file_content</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</code></pre><p><span class="yiyi-st" id="yiyi-182">创建压缩文件:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">lzma</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">b</span><span class="s2">"Insert Data Here"</span>
<span class="k">with</span> <span class="n">lzma</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">"file.xz"</span><span class="p">,</span> <span class="s2">"w"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-183">压缩内存中的数据:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">lzma</span>
<span class="n">data_in</span> <span class="o">=</span> <span class="n">b</span><span class="s2">"Insert Data Here"</span>
<span class="n">data_out</span> <span class="o">=</span> <span class="n">lzma</span><span class="o">.</span><span class="n">compress</span><span class="p">(</span><span class="n">data_in</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-184">增量压缩:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">lzma</span>
<span class="n">lzc</span> <span class="o">=</span> <span class="n">lzma</span><span class="o">.</span><span class="n">LZMACompressor</span><span class="p">()</span>
<span class="n">out1</span> <span class="o">=</span> <span class="n">lzc</span><span class="o">.</span><span class="n">compress</span><span class="p">(</span><span class="n">b</span><span class="s2">"Some data</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="n">out2</span> <span class="o">=</span> <span class="n">lzc</span><span class="o">.</span><span class="n">compress</span><span class="p">(</span><span class="n">b</span><span class="s2">"Another piece of data</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="n">out3</span> <span class="o">=</span> <span class="n">lzc</span><span class="o">.</span><span class="n">compress</span><span class="p">(</span><span class="n">b</span><span class="s2">"Even more data</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="n">out4</span> <span class="o">=</span> <span class="n">lzc</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
<span class="c1"># Concatenate all the partial results:</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">b</span><span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">out1</span><span class="p">,</span> <span class="n">out2</span><span class="p">,</span> <span class="n">out3</span><span class="p">,</span> <span class="n">out4</span><span class="p">])</span>
</code></pre><p><span class="yiyi-st" id="yiyi-185">将压缩数据写入已打开的文件:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">lzma</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"file.xz"</span><span class="p">,</span> <span class="s2">"wb"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">b</span><span class="s2">"This data will not be compressed</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="k">with</span> <span class="n">lzma</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s2">"w"</span><span class="p">)</span> <span class="k">as</span> <span class="n">lzf</span><span class="p">:</span>
<span class="n">lzf</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">b</span><span class="s2">"This *will* be compressed</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">b</span><span class="s2">"Not compressed</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-186">使用自定义过滤器链创建压缩文件:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">lzma</span>
<span class="n">my_filters</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="n">lzma</span><span class="o">.</span><span class="n">FILTER_DELTA</span><span class="p">,</span> <span class="s2">"dist"</span><span class="p">:</span> <span class="mi">5</span><span class="p">},</span>
<span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="n">lzma</span><span class="o">.</span><span class="n">FILTER_LZMA2</span><span class="p">,</span> <span class="s2">"preset"</span><span class="p">:</span> <span class="mi">7</span> <span class="o">|</span> <span class="n">lzma</span><span class="o">.</span><span class="n">PRESET_EXTREME</span><span class="p">},</span>
<span class="p">]</span>
<span class="k">with</span> <span class="n">lzma</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">"file.xz"</span><span class="p">,</span> <span class="s2">"w"</span><span class="p">,</span> <span class="n">filters</span><span class="o">=</span><span class="n">my_filters</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">b</span><span class="s2">"blah blah blah"</span><span class="p">)</span>
</code></pre></div></div></div>