uTools-Manuals/docs/python/zipfile.html

16 lines
61 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-zipfile"><h1><span class="yiyi-st" id="yiyi-10">13.5. <a class="reference internal" href="#module-zipfile" title="zipfile: Read and write ZIP-format archive files."><code class="xref py py-mod docutils literal"><span class="pre">zipfile</span></code></a> — ZIP 归档访问</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/zipfile.py">Lib / zipfile.py</a></span></p><p><span class="yiyi-st" id="yiyi-12">ZIP文件格式是一种常见的归档和压缩标准.</span><span class="yiyi-st" id="yiyi-13">本模块提供了工具来创建、 读、 写、 追加,列出一个 ZIP 文件。</span><span class="yiyi-st" id="yiyi-14">此模块的任何高级使用将需要了解如<a class="reference external" href="https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT">PKZIP应用笔记</a>中定义的格式。</span></p><p><span class="yiyi-st" id="yiyi-15">本模块不能目前处理多磁盘 ZIP 文件。</span><span class="yiyi-st" id="yiyi-16">它可以处理 ZIP 文件,使用 ZIP64 扩展 (也就是那些在大小超过 4 GiB 的 ZIP 文件)。</span><span class="yiyi-st" id="yiyi-17">它支持加密ZIP 存档文件的解密,但它当前不能创建加密的文件。</span><span class="yiyi-st" id="yiyi-18">解密是极其缓慢的当它在本机 Python而不是 C.中实现.</span></p><p><span class="yiyi-st" id="yiyi-19">模块定义以下项目:</span></p><dl class="exception"><dt id="zipfile.BadZipFile"><span class="yiyi-st" id="yiyi-20"> <em class="property">exception </em><code class="descclassname">zipfile.</code><code class="descname">BadZipFile</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-21">错误ZIP文件引发的错误。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-22"><span class="versionmodified">版本3.2中的新功能。</span></span></p></div></dd></dl><dl class="exception"><dt id="zipfile.BadZipfile"><span class="yiyi-st" id="yiyi-23"> <em class="property">exception </em><code class="descclassname">zipfile.</code><code class="descname">BadZipfile</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-24">为了与旧的Python版本兼容<a class="reference internal" href="#zipfile.BadZipFile" title="zipfile.BadZipFile"><code class="xref py py-exc docutils literal"><span class="pre">BadZipFile</span></code></a>的别名。</span></p><div class="deprecated"><p><span class="yiyi-st" id="yiyi-25"><span class="versionmodified">自3.2版起已弃用。</span></span></p></div></dd></dl><dl class="exception"><dt id="zipfile.LargeZipFile"><span class="yiyi-st" id="yiyi-26"> <em class="property">exception </em><code class="descclassname">zipfile.</code><code class="descname">LargeZipFile</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-27">ZIP文件需要ZIP64功能但尚未启用时引发的错误。</span></p></dd></dl><dl class="class"><dt><span class="yiyi-st" id="yiyi-28"><em class="property">class</em> <code class="descclassname">zipfile.</code> <code class="descname">ZipFile</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-29">用于读取和写入ZIP文件的类。</span><span class="yiyi-st" id="yiyi-30">有关构造函数的详细信息,请参见<a class="reference internal" href="#zipfile-objects"><span>ZipFile Objects</span></a>一节。</span></p></dd></dl><dl class="class"><dt><span class="yiyi-st" id="yiyi-31"><em class="property">class</em> <code class="descclassname">zipfile.</code> <code class="descname">PyZipFile</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-32">用于创建包含Python库的ZIP存档的类。</span></p></dd></dl><dl class="class"><dt id="zipfile.ZipInfo"><span class="yiyi-st" id="yiyi-33"> <em class="property">class </em><code class="descclassname">zipfile.</code><code class="descname">ZipInfo</code><span class="sig-paren">(</span><em>filename='NoName'</em>, <em>date_time=(1980</em>, <em>1</em>, <em>1</em>, <em>0</em>, <em>0</em>, <em>0)</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-34">用于表示有关归档成员的信息的类。</span><span class="yiyi-st" id="yiyi-35">此类的实例由<a class="reference internal" href="#zipfile.ZipFile" title="zipfile.ZipFile"><code class="xref py py-class docutils literal"><span class="pre">ZipFile</span></code></a>对象的<a class="reference internal" href="#zipfile.ZipFile.getinfo" title="zipfile.ZipFile.getinfo"><code class="xref py py-meth docutils literal"><span class="pre">getinfo()</span></code></a><a class="reference internal" href="#zipfile.ZipFile.infolist" title="zipfile.ZipFile.infolist"><code class="xref py py-meth docutils literal"><span class="pre">infolist()</span></code></a>方法返回。</span><span class="yiyi-st" id="yiyi-36"><a class="reference internal" href="#module-zipfile" title="zipfile: Read and write ZIP-format archive files."><code class="xref py py-mod docutils literal"><span class="pre">zipfile</span></code></a>模块的大多数用户不需要创建这些模块,而只使用由此模块创建的模块。</span><span class="yiyi-st" id="yiyi-37"><em>filename</em>应为存档成员的全名,<em>date_time</em>应为包含六个字段的元组,这六个字段描述文件最后一次修改的时间;这些字段在<a class="reference internal" href="#zipinfo-objects"><span>ZipInfo Objects</span></a>部分中描述。</span></p></dd></dl><dl class="function"><dt id="zipfile.is_zipfile"><span class="yiyi-st" id="yiyi-38"> <code class="descclassname">zipfile.</code><code class="descname">is_zipfile</code><span class="sig-paren">(</span><em>filename</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-39">如果<em>filename</em>是基于其幻数的有效ZIP文件则返回<code class="docutils literal"><span class="pre">True</span></code>,否则返回<code class="docutils literal"><span class="pre">False</span></code></span><span class="yiyi-st" id="yiyi-40"><em>filename</em>也可以是文件或类似文件的对象。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-41"><span class="versionmodified">在3.1版中已更改:</span>支持文件和类似文件的对象。</span></p></div></dd></dl><dl class="data"><dt id="zipfile.ZIP_STORED"><span class="yiyi-st" id="yiyi-42"> <code class="descclassname">zipfile.</code><code class="descname">ZIP_STORED</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-43">未压缩的归档成员的数字常量。</span></p></dd></dl><dl class="data"><dt id="zipfile.ZIP_DEFLATED"><span class="yiyi-st" id="yiyi-44"> <code class="descclassname">zipfile.</code><code class="descname">ZIP_DEFLATED</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-45">常用ZIP压缩方法的数字常量。</span><span class="yiyi-st" id="yiyi-46">这需要<a class="reference internal" href="zlib.html#module-zlib" title="zlib: Low-level interface to compression and decompression routines compatible with gzip."><code class="xref py py-mod docutils literal"><span class="pre">zlib</span></code></a>模块。</span></p></dd></dl><dl class="data"><dt id="zipfile.ZIP_BZIP2"><span class="yiyi-st" id="yiyi-47"> <code class="descclassname">zipfile.</code><code class="descname">ZIP_BZIP2</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-48">BZIP2压缩方法的数字常量。</span><span class="yiyi-st" id="yiyi-49">这需要<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></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-50"><span class="versionmodified">版本3.3中的新功能。</span></span></p></div></dd></dl><dl class="data"><dt id="zipfile.ZIP_LZMA"><span class="yiyi-st" id="yiyi-51"> <code class="descclassname">zipfile.</code><code class="descname">ZIP_LZMA</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-52">LZMA压缩方法的数字常量。</span><span class="yiyi-st" id="yiyi-53">这需要<a class="reference internal" href="lzma.html#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>模块。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-54"><span class="versionmodified">版本3.3中的新功能。</span></span></p></div><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-55">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-56">ZIP文件格式规范包括自2001年以来对bzip2压缩的支持以及自2006年以来的LZMA压缩。</span><span class="yiyi-st" id="yiyi-57">但是一些工具包括旧的Python版本不支持这些压缩方法可能会拒绝完全处理ZIP文件或无法提取单个文件。</span></p></div></dd></dl><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-58">也可以看看</span></p><dl class="last docutils"><dt><span class="yiyi-st" id="yiyi-59"><a class="reference external" href="https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT">PKZIP应用笔记</a></span></dt><dd><span class="yiyi-st" id="yiyi-60">关于ZIP文件格式的文档由Phil Katz使用的格式和算法的创建者。</span></dd><dt><span class="yiyi-st" id="yiyi-61"><a class="reference external" href="http://www.info-zip.org/">Info-ZIP主页</a></span></dt><dd><span class="yiyi-st" id="yiyi-62">有关Info-ZIP项目的ZIP归档程序和开发库的信息。</span></dd></dl></div><div class="section" id="zipfile-objects"><h2><span class="yiyi-st" id="yiyi-63">13.5.1. </span><span class="yiyi-st" id="yiyi-64">ZipFile Objects</span></h2><dl class="class"><dt id="zipfile.ZipFile"><span class="yiyi-st" id="yiyi-65"> <em class="property">class </em><code class="descclassname">zipfile.</code><code class="descname">ZipFile</code><span class="sig-paren">(</span><em>file</em>, <em>mode='r'</em>, <em>compression=ZIP_STORED</em>, <em>allowZip64=True</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-66">打开ZIP文件其中<em>文件</em>可以是文件(字符串)或类似文件的对象的路径。</span><span class="yiyi-st" id="yiyi-67"><em>模式</em>参数应为<code class="docutils literal"><span class="pre">'r'</span></code>以读取现有文件<code class="docutils literal"><span class="pre">'w'</span></code>以截断并写入新文件<code class="docutils literal"><span class="pre">'a'</span></code>以附加到现有文件,或<code class="docutils literal"><span class="pre">'x'</span></code>以专门创建和写入新文件。</span><span class="yiyi-st" id="yiyi-68">如果<em>模式</em><code class="docutils literal"><span class="pre">'x'</span></code><em>file变量</em>指现有文件,则会引发<a class="reference internal" href="exceptions.html#FileExistsError" title="FileExistsError"><code class="xref py py-exc docutils literal"><span class="pre">FileExistsError</span></code></a></span><span class="yiyi-st" id="yiyi-69">如果<em>模式</em><code class="docutils literal"><span class="pre">'a'</span></code><em>文件</em>指现有的ZIP文件则会向其添加其他文件。</span><span class="yiyi-st" id="yiyi-70">如果<em>文件</em>不引用ZIP文件则会将新的ZIP存档附加到该文件。</span><span class="yiyi-st" id="yiyi-71">这是为了将ZIP存档添加到另一个文件例如<code class="file docutils literal"><span class="pre">python.exe</span></code>)。</span><span class="yiyi-st" id="yiyi-72">如果<em>模式</em><code class="docutils literal"><span class="pre">a</span></code>,且文件根本不存在,则会创建该文件。</span><span class="yiyi-st" id="yiyi-73">如果<em>模式</em><code class="docutils literal"><span class="pre">r</span></code><code class="docutils literal"><span class="pre">a</span></code>,则文件应为可搜索的。</span><span class="yiyi-st" id="yiyi-74"><em>压缩</em>是在撰写封存时使用的ZIP压缩方法应为<a class="reference internal" href="#zipfile.ZIP_STORED" title="zipfile.ZIP_STORED"><code class="xref py py-const docutils literal"><span class="pre">ZIP_STORED</span></code></a><a class="reference internal" href="#zipfile.ZIP_DEFLATED" title="zipfile.ZIP_DEFLATED"><code class="xref py py-const docutils literal"><span class="pre">ZIP_DEFLATED</span></code></a><a class="reference internal" href="#zipfile.ZIP_BZIP2" title="zipfile.ZIP_BZIP2"><code class="xref py py-const docutils literal"><span class="pre">ZIP_BZIP2</span></code></a> <a class="reference internal" href="#zipfile.ZIP_LZMA" title="zipfile.ZIP_LZMA"><code class="xref py py-const docutils literal"><span class="pre">ZIP_LZMA</span></code></a>;无法识别的值将引起<a class="reference internal" href="exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal"><span class="pre">RuntimeError</span></code></a></span><span class="yiyi-st" id="yiyi-75">If <a class="reference internal" href="#zipfile.ZIP_DEFLATED" title="zipfile.ZIP_DEFLATED"><code class="xref py py-const docutils literal"><span class="pre">ZIP_DEFLATED</span></code></a>, <a class="reference internal" href="#zipfile.ZIP_BZIP2" title="zipfile.ZIP_BZIP2"><code class="xref py py-const docutils literal"><span class="pre">ZIP_BZIP2</span></code></a> or <a class="reference internal" href="#zipfile.ZIP_LZMA" title="zipfile.ZIP_LZMA"><code class="xref py py-const docutils literal"><span class="pre">ZIP_LZMA</span></code></a> is specified but the corresponding module (<a class="reference internal" href="zlib.html#module-zlib" title="zlib: Low-level interface to compression and decompression routines compatible with gzip."><code class="xref py py-mod docutils literal"><span class="pre">zlib</span></code></a>, <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> or <a class="reference internal" href="lzma.html#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>) is not available, <a class="reference internal" href="exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal"><span class="pre">RuntimeError</span></code></a> is also raised. </span><span class="yiyi-st" id="yiyi-76">默认值为<a class="reference internal" href="#zipfile.ZIP_STORED" title="zipfile.ZIP_STORED"><code class="xref py py-const docutils literal"><span class="pre">ZIP_STORED</span></code></a></span><span class="yiyi-st" id="yiyi-77">如果<em>allowZip64</em><code class="docutils literal"><span class="pre">True</span></code>默认值zip文件将创建ZIP文件当zip文件大于2 GiB时使用ZIP64扩展。</span><span class="yiyi-st" id="yiyi-78">如果为false则当ZIP文件需要ZIP64扩展时<a class="reference internal" href="#module-zipfile" title="zipfile: Read and write ZIP-format archive files."><code class="xref py py-mod docutils literal"><span class="pre">zipfile</span></code></a>将引发异常。</span></p><p><span class="yiyi-st" id="yiyi-79">如果使用模式<code class="docutils literal"><span class="pre">'w'</span></code><code class="docutils literal"><span class="pre">'x'</span></code><code class="docutils literal"><span class="pre">'a'</span></code>创建文件,然后按<a class="reference internal" href="#zipfile.ZipFile.close" title="zipfile.ZipFile.close"><code class="xref py py-meth docutils literal"><span class="pre">closed</span></code></a>将任何文件添加到归档中空归档的相应ZIP结构将被写入文件。</span></p><p><span class="yiyi-st" id="yiyi-80">ZipFile也是一个上下文管理器因此支持<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><span class="yiyi-st" id="yiyi-81">在示例中,<em>myzip</em><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><pre><code class="language-python"><span></span><span class="k">with</span> <span class="n">ZipFile</span><span class="p">(</span><span class="s1">'spam.zip'</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">myzip</span><span class="p">:</span>
<span class="n">myzip</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'eggs.txt'</span><span class="p">)</span>
</code></pre><div class="versionadded"><p><span class="yiyi-st" id="yiyi-82"><span class="versionmodified">版本3.2中的新功能:</span>添加了使用<a class="reference internal" href="#zipfile.ZipFile" title="zipfile.ZipFile"><code class="xref py py-class docutils literal"><span class="pre">ZipFile</span></code></a>作为上下文管理器的功能。</span></p></div><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-83"><span class="versionmodified">在版本3.3中已更改:</span>添加了对<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">bzip2</span></code></a><a class="reference internal" href="lzma.html#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>压缩的支持。</span></p></div><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-84"><span class="versionmodified">在版本3.4中更改:</span> ZIP64扩展名默认情况下已启用。</span></p></div><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-85"><span class="versionmodified">在3.5版本中进行了更改:</span>添加了对写入不可搜索流的支持。</span><span class="yiyi-st" id="yiyi-86">添加了对<code class="docutils literal"><span class="pre">'x'</span></code>模式的支持。</span></p></div></dd></dl><dl class="method"><dt id="zipfile.ZipFile.close"><span class="yiyi-st" id="yiyi-87"> <code class="descclassname">ZipFile.</code><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-88">关闭归档文件。</span><span class="yiyi-st" id="yiyi-89">您必须在退出程序之前调用<a class="reference internal" href="#zipfile.ZipFile.close" title="zipfile.ZipFile.close"><code class="xref py py-meth docutils literal"><span class="pre">close()</span></code></a>,否则不会写入基本记录。</span></p></dd></dl><dl class="method"><dt id="zipfile.ZipFile.getinfo"><span class="yiyi-st" id="yiyi-90"> <code class="descclassname">ZipFile.</code><code class="descname">getinfo</code><span class="sig-paren">(</span><em>name</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-91">返回具有有关归档成员<em>名称</em>的信息的<a class="reference internal" href="#zipfile.ZipInfo" title="zipfile.ZipInfo"><code class="xref py py-class docutils literal"><span class="pre">ZipInfo</span></code></a>对象。</span><span class="yiyi-st" id="yiyi-92">为当前未包含在归档中的名称调用<a class="reference internal" href="#zipfile.ZipFile.getinfo" title="zipfile.ZipFile.getinfo"><code class="xref py py-meth docutils literal"><span class="pre">getinfo()</span></code></a>将引发<a class="reference internal" href="exceptions.html#KeyError" title="KeyError"><code class="xref py py-exc docutils literal"><span class="pre">KeyError</span></code></a></span></p></dd></dl><dl class="method"><dt id="zipfile.ZipFile.infolist"><span class="yiyi-st" id="yiyi-93"> <code class="descclassname">ZipFile.</code><code class="descname">infolist</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-94">返回包含归档的每个成员的<a class="reference internal" href="#zipfile.ZipInfo" title="zipfile.ZipInfo"><code class="xref py py-class docutils literal"><span class="pre">ZipInfo</span></code></a>对象的列表。</span><span class="yiyi-st" id="yiyi-95">如果打开了现有归档则对象与磁盘上实际ZIP文件中的条目的顺序相同。</span></p></dd></dl><dl class="method"><dt id="zipfile.ZipFile.namelist"><span class="yiyi-st" id="yiyi-96"> <code class="descclassname">ZipFile.</code><code class="descname">namelist</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-97">按名称返回归档成员的列表。</span></p></dd></dl><dl class="method"><dt id="zipfile.ZipFile.open"><span class="yiyi-st" id="yiyi-98"> <code class="descclassname">ZipFile.</code><code class="descname">open</code><span class="sig-paren">(</span><em>name</em>, <em>mode='r'</em>, <em>pwd=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-99">从归档中提取成员作为文件状对象ZipExtFile</span><span class="yiyi-st" id="yiyi-100"><em>名称</em>是档案中文件的名称,或<a class="reference internal" href="#zipfile.ZipInfo" title="zipfile.ZipInfo"><code class="xref py py-class docutils literal"><span class="pre">ZipInfo</span></code></a>对象。</span><span class="yiyi-st" id="yiyi-101">The <em>mode</em> parameter, if included, must be one of the following: <code class="docutils literal"><span class="pre">'r'</span></code> (the default), <code class="docutils literal"><span class="pre">'U'</span></code>, or <code class="docutils literal"><span class="pre">'rU'</span></code>. </span><span class="yiyi-st" id="yiyi-102">选择<code class="docutils literal"><span class="pre">'U'</span></code><code class="docutils literal"><span class="pre">'rU'</span></code>将在只读对象中启用<a class="reference internal" href="../glossary.html#term-universal-newlines"><span class="xref std std-term">universal newlines</span></a>支持。</span><span class="yiyi-st" id="yiyi-103"><em>pwd</em>是用于加密文件的密码。</span><span class="yiyi-st" id="yiyi-104">在封闭的ZipFile上调用<a class="reference internal" href="#zipfile.ZipFile.open" title="zipfile.ZipFile.open"><code class="xref py py-meth docutils literal"><span class="pre">open()</span></code></a>会引发<a class="reference internal" href="exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal"><span class="pre">RuntimeError</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-105"><a class="reference internal" href="#zipfile.ZipFile.open" title="zipfile.ZipFile.open"><code class="xref py py-meth docutils literal"><span class="pre">open()</span></code></a>也是一个上下文管理器,因此支持<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><pre><code class="language-python"><span></span><span class="k">with</span> <span class="n">ZipFile</span><span class="p">(</span><span class="s1">'spam.zip'</span><span class="p">)</span> <span class="k">as</span> <span class="n">myzip</span><span class="p">:</span>
<span class="k">with</span> <span class="n">myzip</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">'eggs.txt'</span><span class="p">)</span> <span class="k">as</span> <span class="n">myfile</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">myfile</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
</code></pre><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-106">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-107">类文件对象是只读的并提供以下方法:<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><a class="reference internal" href="io.html#io.IOBase.readline" title="io.IOBase.readline"><code class="xref py py-meth docutils literal"><span class="pre">readline()</span></code></a><a class="reference internal" href="io.html#io.IOBase.readlines" title="io.IOBase.readlines"><code class="xref py py-meth docutils literal"><span class="pre">readlines()</span></code></a><a class="reference internal" href="../reference/datamodel.html#object.__iter__" title="object.__iter__"><code class="xref py py-meth docutils literal"><span class="pre">__iter__()</span></code></a><a class="reference internal" href="stdtypes.html#iterator.__next__" title="iterator.__next__"><code class="xref py py-meth docutils literal"><span class="pre">__next__()</span></code></a></span></p></div><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-108">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-109"><a class="reference internal" href="#zipfile.ZipFile.open" title="zipfile.ZipFile.open"><code class="xref py py-meth docutils literal"><span class="pre">open()</span></code></a>返回的对象可以独立于ZipFile操作。</span></p></div><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="#zipfile.ZipFile.open" title="zipfile.ZipFile.open"><code class="xref py py-meth docutils literal"><span class="pre">open()</span></code></a><a class="reference internal" href="#zipfile.ZipFile.read" title="zipfile.ZipFile.read"><code class="xref py py-meth docutils literal"><span class="pre">read()</span></code></a><a class="reference internal" href="#zipfile.ZipFile.extract" title="zipfile.ZipFile.extract"><code class="xref py py-meth docutils literal"><span class="pre">extract()</span></code></a>方法可以采用文件名或<a class="reference internal" href="#zipfile.ZipInfo" title="zipfile.ZipInfo"><code class="xref py py-class docutils literal"><span class="pre">ZipInfo</span></code></a></span><span class="yiyi-st" id="yiyi-112">当您尝试读取包含重复名称的成员的ZIP文件时您将会感激此。</span></p></div><div class="deprecated-removed"><p><span class="yiyi-st" id="yiyi-113"><span class="versionmodified">从版本3.4开始弃用将在版本3.6中删除:</span> <code class="docutils literal"><span class="pre">'U'</span></code><code class="docutils literal"><span class="pre">'rU'</span></code>模式。</span><span class="yiyi-st" id="yiyi-114">使用<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><a class="reference internal" href="../glossary.html#term-universal-newlines"><span class="xref std std-term">universal newlines</span></a>模式下读取压缩文本文件。</span></p></div></dd></dl><dl class="method"><dt id="zipfile.ZipFile.extract"><span class="yiyi-st" id="yiyi-115"> <code class="descclassname">ZipFile.</code><code class="descname">extract</code><span class="sig-paren">(</span><em>member</em>, <em>path=None</em>, <em>pwd=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-116">将成员从归档提取到当前工作目录; <em>成员</em>必须是其全名或<a class="reference internal" href="#zipfile.ZipInfo" title="zipfile.ZipInfo"><code class="xref py py-class docutils literal"><span class="pre">ZipInfo</span></code></a>对象。</span><span class="yiyi-st" id="yiyi-117">其文件信息尽可能精确地提取。</span><span class="yiyi-st" id="yiyi-118"><em>路径</em>指定要提取到的不同目录。</span><span class="yiyi-st" id="yiyi-119"><em>成员</em>可以是文件名或<a class="reference internal" href="#zipfile.ZipInfo" title="zipfile.ZipInfo"><code class="xref py py-class docutils literal"><span class="pre">ZipInfo</span></code></a>对象。</span><span class="yiyi-st" id="yiyi-120"><em>pwd</em>是用于加密文件的密码。</span></p><p><span class="yiyi-st" id="yiyi-121">返回已创建的标准化路径(目录或新文件)。</span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-122">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-123">如果成员文件名是绝对路径,则驱动器/ UNC共享点和前导斜杠将被去除。</span><span class="yiyi-st" id="yiyi-124"><code class="docutils literal"><span class="pre">///foo/bar</span></code>在Unix上变为<code class="docutils literal"><span class="pre">foo/bar</span></code>,并且<code class="docutils literal"><span class="pre">C:\foo\bar</span></code>变为<code class="docutils literal"><span class="pre">foo\bar</span></code></span><span class="yiyi-st" id="yiyi-125">并且将删除成员文件名中的所有<code class="docutils literal"><span class="pre">".."</span></code>组件。</span><span class="yiyi-st" id="yiyi-126">: <code class="docutils literal"><span class="pre">../../foo../../ba..r</span></code> becomes <code class="docutils literal"><span class="pre">foo../ba..r</span></code>. On Windows illegal characters (<code class="docutils literal"><span class="pre">:</span></code>, <code class="docutils literal"><span class="pre">&lt;</span></code>, <code class="docutils literal"><span class="pre">&gt;</span></code>, <code class="docutils literal"><span class="pre">|</span></code>, <code class="docutils literal"><span class="pre">"</span></code>, <code class="docutils literal"><span class="pre">?</span></code>, and <code class="docutils literal"><span class="pre">*</span></code>) replaced by underscore (<code class="docutils literal"><span class="pre">_</span></code>).</span></p></div></dd></dl><dl class="method"><dt id="zipfile.ZipFile.extractall"><span class="yiyi-st" id="yiyi-127"> <code class="descclassname">ZipFile.</code><code class="descname">extractall</code><span class="sig-paren">(</span><em>path=None</em>, <em>members=None</em>, <em>pwd=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-128">将归档中的所有成员解压缩到当前工作目录。</span><span class="yiyi-st" id="yiyi-129"><em>路径</em>指定要提取到的不同目录。</span><span class="yiyi-st" id="yiyi-130"><em>成员</em>是可选的,并且必须是由<a class="reference internal" href="#zipfile.ZipFile.namelist" title="zipfile.ZipFile.namelist"><code class="xref py py-meth docutils literal"><span class="pre">namelist()</span></code></a>返回的列表的子集。</span><span class="yiyi-st" id="yiyi-131"><em>pwd</em>是用于加密文件的密码。</span></p><div class="admonition warning"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-132">警告</span></p><p class="last"><span class="yiyi-st" id="yiyi-133">切勿在未经预先检查的情况下从不可信来源中提取存档。</span><span class="yiyi-st" id="yiyi-134">可能在<em>路径</em>之外创建文件,例如</span><span class="yiyi-st" id="yiyi-135">具有以<code class="docutils literal"><span class="pre">"/"</span></code>开头的绝对文件名的成员或具有两个点<code class="docutils literal"><span class="pre">".."</span></code>的文件名。</span><span class="yiyi-st" id="yiyi-136">此模块尝试阻止。</span><span class="yiyi-st" id="yiyi-137">请参阅<a class="reference internal" href="#zipfile.ZipFile.extract" title="zipfile.ZipFile.extract"><code class="xref py py-meth docutils literal"><span class="pre">extract()</span></code></a>注意。</span></p></div></dd></dl><dl class="method"><dt id="zipfile.ZipFile.printdir"><span class="yiyi-st" id="yiyi-138"> <code class="descclassname">ZipFile.</code><code class="descname">printdir</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-139">将归档的目录打印到<code class="docutils literal"><span class="pre">sys.stdout</span></code></span></p></dd></dl><dl class="method"><dt id="zipfile.ZipFile.setpassword"><span class="yiyi-st" id="yiyi-140"> <code class="descclassname">ZipFile.</code><code class="descname">setpassword</code><span class="sig-paren">(</span><em>pwd</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-141"><em>pwd</em>设置为默认密码以提取加密文件。</span></p></dd></dl><dl class="method"><dt id="zipfile.ZipFile.read"><span class="yiyi-st" id="yiyi-142"> <code class="descclassname">ZipFile.</code><code class="descname">read</code><span class="sig-paren">(</span><em>name</em>, <em>pwd=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-143">返回归档中文件<em>名称</em>的字节。</span><span class="yiyi-st" id="yiyi-144"><em>名称</em>是档案中文件的名称,或<a class="reference internal" href="#zipfile.ZipInfo" title="zipfile.ZipInfo"><code class="xref py py-class docutils literal"><span class="pre">ZipInfo</span></code></a>对象。</span><span class="yiyi-st" id="yiyi-145">归档必须打开以进行读取或追加。</span><span class="yiyi-st" id="yiyi-146"><em>pwd</em>是用于加密文件的密码,如果指定,它将覆盖使用<a class="reference internal" href="#zipfile.ZipFile.setpassword" title="zipfile.ZipFile.setpassword"><code class="xref py py-meth docutils literal"><span class="pre">setpassword()</span></code></a>设置的默认密码。</span><span class="yiyi-st" id="yiyi-147">在封闭的ZipFile上调用<a class="reference internal" href="#zipfile.ZipFile.read" title="zipfile.ZipFile.read"><code class="xref py py-meth docutils literal"><span class="pre">read()</span></code></a>会引发<a class="reference internal" href="exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal"><span class="pre">RuntimeError</span></code></a></span><span class="yiyi-st" id="yiyi-148">Calling <a class="reference internal" href="#zipfile.ZipFile.read" title="zipfile.ZipFile.read"><code class="xref py py-meth docutils literal"><span class="pre">read()</span></code></a> on a ZipFile that uses a compression method other than <a class="reference internal" href="#zipfile.ZIP_STORED" title="zipfile.ZIP_STORED"><code class="xref py py-const docutils literal"><span class="pre">ZIP_STORED</span></code></a>, <a class="reference internal" href="#zipfile.ZIP_DEFLATED" title="zipfile.ZIP_DEFLATED"><code class="xref py py-const docutils literal"><span class="pre">ZIP_DEFLATED</span></code></a>, <a class="reference internal" href="#zipfile.ZIP_BZIP2" title="zipfile.ZIP_BZIP2"><code class="xref py py-const docutils literal"><span class="pre">ZIP_BZIP2</span></code></a> or <a class="reference internal" href="#zipfile.ZIP_LZMA" title="zipfile.ZIP_LZMA"><code class="xref py py-const docutils literal"><span class="pre">ZIP_LZMA</span></code></a> will raise a <a class="reference internal" href="exceptions.html#NotImplementedError" title="NotImplementedError"><code class="xref py py-exc docutils literal"><span class="pre">NotImplementedError</span></code></a>. </span><span class="yiyi-st" id="yiyi-149">如果相应的压缩模块不可用,也会出现错误。</span></p></dd></dl><dl class="method"><dt id="zipfile.ZipFile.testzip"><span class="yiyi-st" id="yiyi-150"> <code class="descclassname">ZipFile.</code><code class="descname">testzip</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-151">读取归档中的所有文件并检查其CRC和文件头。</span><span class="yiyi-st" id="yiyi-152">返回第一个坏文件的名称,否则返回<code class="docutils literal"><span class="pre">None</span></code></span><span class="yiyi-st" id="yiyi-153">在封闭的ZipFile上调用<a class="reference internal" href="#zipfile.ZipFile.testzip" title="zipfile.ZipFile.testzip"><code class="xref py py-meth docutils literal"><span class="pre">testzip()</span></code></a>会引发<a class="reference internal" href="exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal"><span class="pre">RuntimeError</span></code></a></span></p></dd></dl><dl class="method"><dt id="zipfile.ZipFile.write"><span class="yiyi-st" id="yiyi-154"> <code class="descclassname">ZipFile.</code><code class="descname">write</code><span class="sig-paren">(</span><em>filename</em>, <em>arcname=None</em>, <em>compress_type=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-155">将名为<em>filename</em>的文件写入归档文件,给它归档名称<em>arcname</em>(默认情况下,这将与<em>filename</em>相同,驱动器盘符,并删除了导向路径分隔符)。</span><span class="yiyi-st" id="yiyi-156">如果给定,<em>compress_type</em>会覆盖为新条目的构造函数为<em>压缩</em>参数指定的值。</span><span class="yiyi-st" id="yiyi-157">The archive must be open with mode <code class="docutils literal"><span class="pre">'w'</span></code>, <code class="docutils literal"><span class="pre">'x'</span></code> or <code class="docutils literal"><span class="pre">'a'</span></code> calling <a class="reference internal" href="#zipfile.ZipFile.write" title="zipfile.ZipFile.write"><code class="xref py py-meth docutils literal"><span class="pre">write()</span></code></a> on a ZipFile created with mode <code class="docutils literal"><span class="pre">'r'</span></code> will raise a <a class="reference internal" href="exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal"><span class="pre">RuntimeError</span></code></a>. </span><span class="yiyi-st" id="yiyi-158">在封闭的ZipFile上调用<a class="reference internal" href="#zipfile.ZipFile.write" title="zipfile.ZipFile.write"><code class="xref py py-meth docutils literal"><span class="pre">write()</span></code></a>会引发<a class="reference internal" href="exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal"><span class="pre">RuntimeError</span></code></a></span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-159">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-160">ZIP文件没有正式的文件名编码。</span><span class="yiyi-st" id="yiyi-161">如果您有unicode文件名则必须在将它们传递到<a class="reference internal" href="#zipfile.ZipFile.write" title="zipfile.ZipFile.write"><code class="xref py py-meth docutils literal"><span class="pre">write()</span></code></a>之前将它们转换为所需编码中的字节字符串。</span><span class="yiyi-st" id="yiyi-162">WinZip将所有文件名解释为在CP437中编码的也称为DOS Latin。</span></p></div><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-163">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-164">归档名称应该相对于归档根目录,也就是说,它们不应以路径分隔符开头。</span></p></div><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-165">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-166">如果<code class="docutils literal"><span class="pre">arcname</span></code>(或<code class="docutils literal"><span class="pre">filename</span></code>,如果未给出<code class="docutils literal"><span class="pre">arcname</span></code>)包含空字节,则归档中的文件名称将被截断空字节。</span></p></div></dd></dl><dl class="method"><dt id="zipfile.ZipFile.writestr"><span class="yiyi-st" id="yiyi-167"> <code class="descclassname">ZipFile.</code><code class="descname">writestr</code><span class="sig-paren">(</span><em>zinfo_or_arcname</em>, <em>data</em><span class="optional">[</span>, <em>compress_type</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-168">将字符串<em>数据</em>写入归档; <em>zinfo_or_arcname</em>是档案中的档案名称,或是<a class="reference internal" href="#zipfile.ZipInfo" title="zipfile.ZipInfo"><code class="xref py py-class docutils literal"><span class="pre">ZipInfo</span></code></a>实例。</span><span class="yiyi-st" id="yiyi-169">如果它是一个实例,至少必须给出文件名,日期和时间。</span><span class="yiyi-st" id="yiyi-170">如果是名称,则日期和时间设置为当前日期和时间。</span><span class="yiyi-st" id="yiyi-171">The archive must be opened with mode <code class="docutils literal"><span class="pre">'w'</span></code>, <code class="docutils literal"><span class="pre">'x'</span></code> or <code class="docutils literal"><span class="pre">'a'</span></code> calling <a class="reference internal" href="#zipfile.ZipFile.writestr" title="zipfile.ZipFile.writestr"><code class="xref py py-meth docutils literal"><span class="pre">writestr()</span></code></a> on a ZipFile created with mode <code class="docutils literal"><span class="pre">'r'</span></code> will raise a <a class="reference internal" href="exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal"><span class="pre">RuntimeError</span></code></a>. </span><span class="yiyi-st" id="yiyi-172">在封闭的ZipFile上调用<a class="reference internal" href="#zipfile.ZipFile.writestr" title="zipfile.ZipFile.writestr"><code class="xref py py-meth docutils literal"><span class="pre">writestr()</span></code></a>会引发<a class="reference internal" href="exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal"><span class="pre">RuntimeError</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-173">如果给定,<em>compress_type</em>会覆盖为新条目的构造函数或<em>zinfo_or_arcname</em>中给出的<em>压缩</em>参数的值(如果是<a class="reference internal" href="#zipfile.ZipInfo" title="zipfile.ZipInfo"><code class="xref py py-class docutils literal"><span class="pre">ZipInfo</span></code></a>实例)。</span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-174">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-175">When passing a <a class="reference internal" href="#zipfile.ZipInfo" title="zipfile.ZipInfo"><code class="xref py py-class docutils literal"><span class="pre">ZipInfo</span></code></a> instance as the <em>zinfo_or_arcname</em> parameter, the compression method used will be that specified in the <em>compress_type</em> member of the given <a class="reference internal" href="#zipfile.ZipInfo" title="zipfile.ZipInfo"><code class="xref py py-class docutils literal"><span class="pre">ZipInfo</span></code></a> instance. </span><span class="yiyi-st" id="yiyi-176">默认情况下,<a class="reference internal" href="#zipfile.ZipInfo" title="zipfile.ZipInfo"><code class="xref py py-class docutils literal"><span class="pre">ZipInfo</span></code></a>构造函数将此成员设置为<a class="reference internal" href="#zipfile.ZIP_STORED" title="zipfile.ZIP_STORED"><code class="xref py py-const docutils literal"><span class="pre">ZIP_STORED</span></code></a></span></p></div><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-177"><span class="versionmodified">在版本3.2中更改:</span> <em>compress_type</em>参数。</span></p></div></dd></dl><p><span class="yiyi-st" id="yiyi-178">还提供以下数据属性:</span></p><dl class="attribute"><dt id="zipfile.ZipFile.debug"><span class="yiyi-st" id="yiyi-179"> <code class="descclassname">ZipFile.</code><code class="descname">debug</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-180">要使用的调试输出的级别。</span><span class="yiyi-st" id="yiyi-181">这可以从<code class="docutils literal"><span class="pre">0</span></code>(默认值,无输出)设置为<code class="docutils literal"><span class="pre">3</span></code>(最大输出)。</span><span class="yiyi-st" id="yiyi-182">调试信息写入<code class="docutils literal"><span class="pre">sys.stdout</span></code></span></p></dd></dl><dl class="attribute"><dt id="zipfile.ZipFile.comment"><span class="yiyi-st" id="yiyi-183"> <code class="descclassname">ZipFile.</code><code class="descname">comment</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-184">与ZIP文件相关联的注释文本。</span><span class="yiyi-st" id="yiyi-185">如果为使用模式<code class="docutils literal"><span class="pre">'w'</span></code><code class="docutils literal"><span class="pre">'x'</span></code><code class="docutils literal"><span class="pre">'a'</span></code>创建的<a class="reference internal" href="#zipfile.ZipFile" title="zipfile.ZipFile"><code class="xref py py-class docutils literal"><span class="pre">ZipFile</span></code></a> 这应该是不超过65535字节的字符串。</span><span class="yiyi-st" id="yiyi-186">当调用<a class="reference internal" href="#zipfile.ZipFile.close" title="zipfile.ZipFile.close"><code class="xref py py-meth docutils literal"><span class="pre">close()</span></code></a>时,长于此值的注释将在写入的归档中被截断。</span></p></dd></dl></div><div class="section" id="pyzipfile-objects"><h2><span class="yiyi-st" id="yiyi-187">13.5.2. </span><span class="yiyi-st" id="yiyi-188">PyZipFile Objects</span></h2><p><span class="yiyi-st" id="yiyi-189"><a class="reference internal" href="#zipfile.PyZipFile" title="zipfile.PyZipFile"><code class="xref py py-class docutils literal"><span class="pre">PyZipFile</span></code></a>构造函数使用与<a class="reference internal" href="#zipfile.ZipFile" title="zipfile.ZipFile"><code class="xref py py-class docutils literal"><span class="pre">ZipFile</span></code></a>构造函数相同的参数,以及一个附加参数<em>optimize</em></span></p><dl class="class"><dt id="zipfile.PyZipFile"><span class="yiyi-st" id="yiyi-190"> <em class="property">class </em><code class="descclassname">zipfile.</code><code class="descname">PyZipFile</code><span class="sig-paren">(</span><em>file</em>, <em>mode='r'</em>, <em>compression=ZIP_STORED</em>, <em>allowZip64=True</em>, <em>optimize=-1</em><span class="sig-paren">)</span></span></dt><dd><div class="versionadded"><p><span class="yiyi-st" id="yiyi-191"><span class="versionmodified">版本3.2中的新功能:</span> <em>optimize</em>参数。</span></p></div><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-192"><span class="versionmodified">在版本3.4中更改:</span> ZIP64扩展名默认情况下已启用。</span></p></div><p><span class="yiyi-st" id="yiyi-193">除了<a class="reference internal" href="#zipfile.ZipFile" title="zipfile.ZipFile"><code class="xref py py-class docutils literal"><span class="pre">ZipFile</span></code></a>对象之外,实例还有一个方法:</span></p><dl class="method"><dt id="zipfile.PyZipFile.writepy"><span class="yiyi-st" id="yiyi-194"> <code class="descname">writepy</code><span class="sig-paren">(</span><em>pathname</em>, <em>basename=''</em>, <em>filterfunc=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-195">搜索文件<code class="file docutils literal"><span class="pre">*.py</span></code>并将相应的文件添加到存档。</span></p><p><span class="yiyi-st" id="yiyi-196">如果未给出<a class="reference internal" href="#zipfile.PyZipFile" title="zipfile.PyZipFile"><code class="xref py py-class docutils literal"><span class="pre">PyZipFile</span></code></a><em>optimize</em>参数或<code class="docutils literal"><span class="pre">-1</span></code>,则相应的文件为<code class="file docutils literal"><span class="pre">*.pyc</span></code>文件,如有必要,进行编译。</span></p><p><span class="yiyi-st" id="yiyi-197">If the <em>optimize</em> parameter to <a class="reference internal" href="#zipfile.PyZipFile" title="zipfile.PyZipFile"><code class="xref py py-class docutils literal"><span class="pre">PyZipFile</span></code></a> was <code class="docutils literal"><span class="pre">0</span></code>, <code class="docutils literal"><span class="pre">1</span></code> or <code class="docutils literal"><span class="pre">2</span></code>, only files with that optimization level (see <a class="reference internal" href="functions.html#compile" title="compile"><code class="xref py py-func docutils literal"><span class="pre">compile()</span></code></a>) are added to the archive, compiling if necessary.</span></p><p><span class="yiyi-st" id="yiyi-198">如果<em>pathname</em>是文件,则文件名必须以<code class="file docutils literal"><span class="pre">.py</span></code>结尾,并且只添加(对应的<code class="file docutils literal"><span class="pre">*.py[co]</span></code></span><span class="yiyi-st" id="yiyi-199">如果<em>路径名</em>是不以<code class="file docutils literal"><span class="pre">.py</span></code>结尾的文件,则会引发<a class="reference internal" href="exceptions.html#RuntimeError" title="RuntimeError"><code class="xref py py-exc docutils literal"><span class="pre">RuntimeError</span></code></a></span><span class="yiyi-st" id="yiyi-200">如果它是一个目录,并且该目录不是包目录,则在顶层添加所有文件<code class="file docutils literal"><span class="pre">*.py[co]</span></code></span><span class="yiyi-st" id="yiyi-201">如果目录是包目录,则所有<code class="file docutils literal"><span class="pre">*.py[co]</span></code>作为文件路径添加到包名称下,如果任何子目录是包目录,则所有这些都是递归添加的。</span></p><p><span class="yiyi-st" id="yiyi-202"><em>basename</em>仅供内部使用。</span></p><p><span class="yiyi-st" id="yiyi-203"><em>filterfunc</em>,如果给定,必须是一个单个字符串参数的函数。</span><span class="yiyi-st" id="yiyi-204">它将在添加到归档文件之前传递每个路径(包括每个单独的完整文件路径)。</span><span class="yiyi-st" id="yiyi-205">如果<em>filterfunc</em>返回false值则不会添加路径如果它是目录则其内容将被忽略。</span><span class="yiyi-st" id="yiyi-206">例如,如果我们的测试文件都在<code class="docutils literal"><span class="pre">test</span></code>目录中或以字符串<code class="docutils literal"><span class="pre">test_</span></code>开头,我们可以使用<em>filterfunc</em></span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">zf</span> <span class="o">=</span> <span class="n">PyZipFile</span><span class="p">(</span><span class="s1">'myprog.zip'</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">notests</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
<span class="gp">... </span> <span class="n">fn</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="gp">... </span> <span class="k">return</span> <span class="p">(</span><span class="ow">not</span> <span class="p">(</span><span class="n">fn</span> <span class="o">==</span> <span class="s1">'test'</span> <span class="ow">or</span> <span class="n">fn</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'test_'</span><span class="p">)))</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">zf</span><span class="o">.</span><span class="n">writepy</span><span class="p">(</span><span class="s1">'myprog'</span><span class="p">,</span> <span class="n">filterfunc</span><span class="o">=</span><span class="n">notests</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-207"><a class="reference internal" href="#zipfile.PyZipFile.writepy" title="zipfile.PyZipFile.writepy"><code class="xref py py-meth docutils literal"><span class="pre">writepy()</span></code></a>方法使档案具有如下所示的文件名:</span></p><pre><code class="language-python"><span></span><span class="n">string</span><span class="o">.</span><span class="n">pyc</span> <span class="c1"># Top level name</span>
<span class="n">test</span><span class="o">/</span><span class="n">__init__</span><span class="o">.</span><span class="n">pyc</span> <span class="c1"># Package directory</span>
<span class="n">test</span><span class="o">/</span><span class="n">testall</span><span class="o">.</span><span class="n">pyc</span> <span class="c1"># Module test.testall</span>
<span class="n">test</span><span class="o">/</span><span class="n">bogus</span><span class="o">/</span><span class="n">__init__</span><span class="o">.</span><span class="n">pyc</span> <span class="c1"># Subpackage directory</span>
<span class="n">test</span><span class="o">/</span><span class="n">bogus</span><span class="o">/</span><span class="n">myfile</span><span class="o">.</span><span class="n">pyc</span> <span class="c1"># Submodule test.bogus.myfile</span>
</code></pre><div class="versionadded"><p><span class="yiyi-st" id="yiyi-208"><span class="versionmodified">版本3.4中的新功能:</span> <em>filterfunc</em>参数。</span></p></div></dd></dl></dd></dl></div><div class="section" id="zipinfo-objects"><h2><span class="yiyi-st" id="yiyi-209">13.5.3. </span><span class="yiyi-st" id="yiyi-210">ZipInfo Objects</span></h2><p><span class="yiyi-st" id="yiyi-211"><a class="reference internal" href="#zipfile.ZipInfo" title="zipfile.ZipInfo"><code class="xref py py-class docutils literal"><span class="pre">ZipInfo</span></code></a>类的实例由<a class="reference internal" href="#zipfile.ZipFile" title="zipfile.ZipFile"><code class="xref py py-class docutils literal"><span class="pre">ZipFile</span></code></a>对象的<a class="reference internal" href="#zipfile.ZipFile.getinfo" title="zipfile.ZipFile.getinfo"><code class="xref py py-meth docutils literal"><span class="pre">getinfo()</span></code></a><a class="reference internal" href="#zipfile.ZipFile.infolist" title="zipfile.ZipFile.infolist"><code class="xref py py-meth docutils literal"><span class="pre">infolist()</span></code></a>方法返回。</span><span class="yiyi-st" id="yiyi-212">每个对象存储有关ZIP归档的单个成员的信息。</span></p><p><span class="yiyi-st" id="yiyi-213">实例具有以下属性:</span></p><dl class="attribute"><dt id="zipfile.ZipInfo.filename"><span class="yiyi-st" id="yiyi-214"> <code class="descclassname">ZipInfo.</code><code class="descname">filename</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-215">归档中的文件的名称。</span></p></dd></dl><dl class="attribute"><dt id="zipfile.ZipInfo.date_time"><span class="yiyi-st" id="yiyi-216"> <code class="descclassname">ZipInfo.</code><code class="descname">date_time</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-217">上次修改归档成员的时间和日期。</span><span class="yiyi-st" id="yiyi-218">这是一个包含六个值的元组:</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-219">指数</span></th><th class="head"><span class="yiyi-st" id="yiyi-220"></span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-221"><code class="docutils literal"><span class="pre">0</span></code></span></td><td><span class="yiyi-st" id="yiyi-222">年(&gt; = 1980</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-223"><code class="docutils literal"><span class="pre">1</span></code></span></td><td><span class="yiyi-st" id="yiyi-224">从1个月</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-225"><code class="docutils literal"><span class="pre">2</span></code></span></td><td><span class="yiyi-st" id="yiyi-226">日(月份)</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-227"><code class="docutils literal"><span class="pre">3</span></code></span></td><td><span class="yiyi-st" id="yiyi-228">小时(从零开始)</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-229"><code class="docutils literal"><span class="pre">4</span></code></span></td><td><span class="yiyi-st" id="yiyi-230">分钟(从零开始)</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-231"><code class="docutils literal"><span class="pre">5</span></code></span></td><td><span class="yiyi-st" id="yiyi-232">秒(从零开始)</span></td></tr></tbody></table><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-233">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-234">ZIP文件格式不支持1980之前的时间戳。</span></p></div></dd></dl><dl class="attribute"><dt id="zipfile.ZipInfo.compress_type"><span class="yiyi-st" id="yiyi-235"> <code class="descclassname">ZipInfo.</code><code class="descname">compress_type</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-236">归档成员的压缩类型。</span></p></dd></dl><dl class="attribute"><dt id="zipfile.ZipInfo.comment"><span class="yiyi-st" id="yiyi-237"> <code class="descclassname">ZipInfo.</code><code class="descname">comment</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-238">个人档案成员的注释。</span></p></dd></dl><dl class="attribute"><dt id="zipfile.ZipInfo.extra"><span class="yiyi-st" id="yiyi-239"> <code class="descclassname">ZipInfo.</code><code class="descname">extra</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-240">扩展字段数据。</span><span class="yiyi-st" id="yiyi-241"><a class="reference external" href="https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT">PKZIP应用程序注释</a>包含对此字符串中包含的数据的内部结构的一些注释。</span></p></dd></dl><dl class="attribute"><dt id="zipfile.ZipInfo.create_system"><span class="yiyi-st" id="yiyi-242"> <code class="descclassname">ZipInfo.</code><code class="descname">create_system</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-243">创建ZIP存档的系统。</span></p></dd></dl><dl class="attribute"><dt id="zipfile.ZipInfo.create_version"><span class="yiyi-st" id="yiyi-244"> <code class="descclassname">ZipInfo.</code><code class="descname">create_version</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-245">PKZIP版本创建ZIP存档。</span></p></dd></dl><dl class="attribute"><dt id="zipfile.ZipInfo.extract_version"><span class="yiyi-st" id="yiyi-246"> <code class="descclassname">ZipInfo.</code><code class="descname">extract_version</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-247">PKZIP版本需要提取归档。</span></p></dd></dl><dl class="attribute"><dt id="zipfile.ZipInfo.reserved"><span class="yiyi-st" id="yiyi-248"> <code class="descclassname">ZipInfo.</code><code class="descname">reserved</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-249">必须为零。</span></p></dd></dl><dl class="attribute"><dt id="zipfile.ZipInfo.flag_bits"><span class="yiyi-st" id="yiyi-250"> <code class="descclassname">ZipInfo.</code><code class="descname">flag_bits</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-251">ZIP标志位。</span></p></dd></dl><dl class="attribute"><dt id="zipfile.ZipInfo.volume"><span class="yiyi-st" id="yiyi-252"> <code class="descclassname">ZipInfo.</code><code class="descname">volume</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-253">文件头的卷编号。</span></p></dd></dl><dl class="attribute"><dt id="zipfile.ZipInfo.internal_attr"><span class="yiyi-st" id="yiyi-254"> <code class="descclassname">ZipInfo.</code><code class="descname">internal_attr</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-255">内部属性。</span></p></dd></dl><dl class="attribute"><dt id="zipfile.ZipInfo.external_attr"><span class="yiyi-st" id="yiyi-256"> <code class="descclassname">ZipInfo.</code><code class="descname">external_attr</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-257">外部文件属性。</span></p></dd></dl><dl class="attribute"><dt id="zipfile.ZipInfo.header_offset"><span class="yiyi-st" id="yiyi-258"> <code class="descclassname">ZipInfo.</code><code class="descname">header_offset</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-259">字节偏移到文件头。</span></p></dd></dl><dl class="attribute"><dt id="zipfile.ZipInfo.CRC"><span class="yiyi-st" id="yiyi-260"> <code class="descclassname">ZipInfo.</code><code class="descname">CRC</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-261">CRC-32的未压缩文件。</span></p></dd></dl><dl class="attribute"><dt id="zipfile.ZipInfo.compress_size"><span class="yiyi-st" id="yiyi-262"> <code class="descclassname">ZipInfo.</code><code class="descname">compress_size</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-263">压缩数据的大小。</span></p></dd></dl><dl class="attribute"><dt id="zipfile.ZipInfo.file_size"><span class="yiyi-st" id="yiyi-264"> <code class="descclassname">ZipInfo.</code><code class="descname">file_size</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-265">未压缩文件的大小。</span></p></dd></dl></div></div></div>