mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 23:14:06 +08:00
16 lines
61 KiB
HTML
16 lines
61 KiB
HTML
<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"><</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>, <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">>>> </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">>>> </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">>>> </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">年(> = 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> |