mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-09 15:34:05 +08:00
32 lines
47 KiB
HTML
32 lines
47 KiB
HTML
<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">LZMAFile(filename,</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> |