uTools-Manuals/docs/python/filecmp.html
2019-04-21 11:50:48 +08:00

11 lines
16 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-filecmp"><h1><span class="yiyi-st" id="yiyi-10">11.5. <a class="reference internal" href="#module-filecmp" title="filecmp: Compare files efficiently."><code class="xref py py-mod docutils literal"><span class="pre">filecmp</span></code></a> - 文件和目录比较</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/filecmp.py">Lib / filecmp.py</a></span></p><p><span class="yiyi-st" id="yiyi-12"><a class="reference internal" href="#module-filecmp" title="filecmp: Compare files efficiently."><code class="xref py py-mod docutils literal"><span class="pre">filecmp</span></code></a>模块定义了用于比较文件和目录的函数,具有各种可选的时间/正确性权衡。</span><span class="yiyi-st" id="yiyi-13">要比较文件,请参见<a class="reference internal" href="difflib.html#module-difflib" title="difflib: Helpers for computing differences between objects."><code class="xref py py-mod docutils literal"><span class="pre">difflib</span></code></a>模块。</span></p><p><span class="yiyi-st" id="yiyi-14"><a class="reference internal" href="#module-filecmp" title="filecmp: Compare files efficiently."><code class="xref py py-mod docutils literal"><span class="pre">filecmp</span></code></a>模块定义了以下函数:</span></p><dl class="function"><dt id="filecmp.cmp"><span class="yiyi-st" id="yiyi-15"> <code class="descclassname">filecmp.</code><code class="descname">cmp</code><span class="sig-paren">(</span><em>f1</em>, <em>f2</em>, <em>shallow=True</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-16">比较名为<em>f1</em><em>f2</em>的文件,如果它们相等则返回<code class="docutils literal"><span class="pre">True</span></code>,否则返回<code class="docutils literal"><span class="pre">False</span></code></span></p><p><span class="yiyi-st" id="yiyi-17">如果<em>shallow</em>为真,则具有相同<a class="reference internal" href="os.html#os.stat" title="os.stat"><code class="xref py py-func docutils literal"><span class="pre">os.stat()</span></code></a>签名的文件将被视为相等。</span><span class="yiyi-st" id="yiyi-18">否则,将比较文件的内容。</span></p><p><span class="yiyi-st" id="yiyi-19">注意该函数没有调用外部的程序,因此给它带来可移植性和高效率。</span></p><p><span class="yiyi-st" id="yiyi-20">此函数使用缓存进行过去的比较和结果,如果文件的<a class="reference internal" href="os.html#os.stat" title="os.stat"><code class="xref py py-func docutils literal"><span class="pre">os.stat()</span></code></a>信息更改,缓存条目将无效。</span><span class="yiyi-st" id="yiyi-21">可以使用<a class="reference internal" href="#filecmp.clear_cache" title="filecmp.clear_cache"><code class="xref py py-func docutils literal"><span class="pre">clear_cache()</span></code></a>清除整个高速缓存。</span></p></dd></dl><dl class="function"><dt id="filecmp.cmpfiles"><span class="yiyi-st" id="yiyi-22"> <code class="descclassname">filecmp.</code><code class="descname">cmpfiles</code><span class="sig-paren">(</span><em>dir1</em>, <em>dir2</em>, <em>common</em>, <em>shallow=True</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-23">比较<em>dir1</em><em>dir2</em>两个目录中文件,文件的名字由<em>common</em>给出。</span></p><p><span class="yiyi-st" id="yiyi-24">返回三个文件名列表:<em>match</em><em>mismatch</em><em>errors</em></span><span class="yiyi-st" id="yiyi-25"><em>mtach</em>包含匹配文件的列表,<em>mismatch</em>包含不匹配文件的列表,<em>errors</em>列出无法比较的文件的名称。</span><span class="yiyi-st" id="yiyi-26">如果文件在其中一个目录中不存在,用户没有足够的权限读取它们,或者某些其他原因不可比较,那么它们将在<em>errors</em>中列出。</span></p><p><span class="yiyi-st" id="yiyi-27"><em>shallow</em>参数与<a class="reference internal" href="#filecmp.cmp" title="filecmp.cmp"><code class="xref py py-func docutils literal"><span class="pre">filecmp.cmp()</span></code></a>具有相同的含义和默认值。</span></p><p><span class="yiyi-st" id="yiyi-28">例如,<code class="docutils literal"><span class="pre">cmpfiles'a'</span> <span class="pre">'b'</span> <span class="pre">['c'</span> <span class="pre">'d / e' ]</span></code>会将<code class="docutils literal"><span class="pre">a/c</span></code><code class="docutils literal"><span class="pre">b/c</span></code><code class="docutils literal"><span class="pre">a/d/e</span></code><code class="docutils literal"><span class="pre">b/d/e</span></code></span><span class="yiyi-st" id="yiyi-29"><code class="docutils literal"><span class="pre">'c'</span></code><code class="docutils literal"><span class="pre">'d/e'</span></code>将分别位于三个返回的列表之一。</span></p></dd></dl><dl class="function"><dt id="filecmp.clear_cache"><span class="yiyi-st" id="yiyi-30"> <code class="descclassname">filecmp.</code><code class="descname">clear_cache</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-31">清除filecmp缓存。</span><span class="yiyi-st" id="yiyi-32">如果文件在修改后在基础文件系统的mtime分辨率内进行比较则这可能是有用的。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-33"><span class="versionmodified">版本3.4中的新功能。</span></span></p></div></dd></dl><div class="section" id="the-dircmp-class"><h2><span class="yiyi-st" id="yiyi-34">11.5.1.</span><span class="yiyi-st" id="yiyi-35"><a class="reference internal" href="#filecmp.dircmp" title="filecmp.dircmp"><code class="xref py py-class docutils literal"><span class="pre">dircmp</span></code></a></span></h2><dl class="class"><dt id="filecmp.dircmp"><span class="yiyi-st" id="yiyi-36"> <em class="property">class </em><code class="descclassname">filecmp.</code><code class="descname">dircmp</code><span class="sig-paren">(</span><em>a</em>, <em>b</em>, <em>ignore=None</em>, <em>hide=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-37">构造一个新的目录比较对象,比较目录<em>a</em><em>b</em><em>忽略</em>是要忽略的名称列表,默认为<a class="reference internal" href="#filecmp.DEFAULT_IGNORES" title="filecmp.DEFAULT_IGNORES"><code class="xref py py-attr docutils literal"><span class="pre">filecmp.DEFAULT_IGNORES</span></code></a></span><span class="yiyi-st" id="yiyi-38"><em>隐藏</em>是要隐藏的名称列表,默认为<code class="docutils literal"><span class="pre">[os.curdir</span> <span class="pre">os.pardir]</span></code></span></p><p><span class="yiyi-st" id="yiyi-39"><a class="reference internal" href="#filecmp.dircmp" title="filecmp.dircmp"><code class="xref py py-class docutils literal"><span class="pre">dircmp</span></code></a>类通过对<a class="reference internal" href="#filecmp.cmp" title="filecmp.cmp"><code class="xref py py-func docutils literal"><span class="pre">filecmp.cmp()</span></code></a>所述执行<em></em>比较来比较文件。</span></p><p><span class="yiyi-st" id="yiyi-40"><a class="reference internal" href="#filecmp.dircmp" title="filecmp.dircmp"><code class="xref py py-class docutils literal"><span class="pre">dircmp</span></code></a>类提供以下方法:</span></p><dl class="method"><dt id="filecmp.dircmp.report"><span class="yiyi-st" id="yiyi-41"> <code class="descname">report</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-42"><em>a</em><em>b</em>之间的比较打印(到<a class="reference internal" href="sys.html#sys.stdout" title="sys.stdout"><code class="xref py py-data docutils literal"><span class="pre">sys.stdout</span></code></a>)。</span></p></dd></dl><dl class="method"><dt id="filecmp.dircmp.report_partial_closure"><span class="yiyi-st" id="yiyi-43"> <code class="descname">report_partial_closure</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-44">打印<em>a</em><em>b</em>以及共有的直接子目录之间的比较。</span></p></dd></dl><dl class="method"><dt id="filecmp.dircmp.report_full_closure"><span class="yiyi-st" id="yiyi-45"> <code class="descname">report_full_closure</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-46">打印<em>a</em><em>b</em>以及共有的子目录(递归地)之间的比较。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-47"><a class="reference internal" href="#filecmp.dircmp" title="filecmp.dircmp"><code class="xref py py-class docutils literal"><span class="pre">dircmp</span></code></a>类提供了许多有趣的属性,可用于获取有关正在比较的目录树的各种位信息。</span></p><p><span class="yiyi-st" id="yiyi-48">注意,通过<a class="reference internal" href="../reference/datamodel.html#object.__getattr__" title="object.__getattr__"><code class="xref py py-meth docutils literal"><span class="pre">__getattr__()</span></code></a>钩子,所有属性都是惰性计算的,因此如果只使用那些轻量级计算的属性,则没有速度损失。</span></p><dl class="attribute"><dt id="filecmp.dircmp.left"><span class="yiyi-st" id="yiyi-49"> <code class="descname">left</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-50">目录<em>a</em></span></p></dd></dl><dl class="attribute"><dt id="filecmp.dircmp.right"><span class="yiyi-st" id="yiyi-51"> <code class="descname">right</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-52">目录<em>b</em></span></p></dd></dl><dl class="attribute"><dt id="filecmp.dircmp.left_list"><span class="yiyi-st" id="yiyi-53"> <code class="descname">left_list</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-54">通过<em>hide</em><em>ignore</em>筛选后,<em>a</em>中的文件和子目录。</span></p></dd></dl><dl class="attribute"><dt id="filecmp.dircmp.right_list"><span class="yiyi-st" id="yiyi-55"> <code class="descname">right_list</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-56">通过<em>hide</em><em>ignore</em>筛选后,<em>b</em>中的文件和子目录。</span></p></dd></dl><dl class="attribute"><dt id="filecmp.dircmp.common"><span class="yiyi-st" id="yiyi-57"> <code class="descname">common</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-58"><em>a</em><em>b</em>中共同的文件和子目录。</span></p></dd></dl><dl class="attribute"><dt id="filecmp.dircmp.left_only"><span class="yiyi-st" id="yiyi-59"> <code class="descname">left_only</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-60">只是<em>a</em> 中的文件和子目录。</span></p></dd></dl><dl class="attribute"><dt id="filecmp.dircmp.right_only"><span class="yiyi-st" id="yiyi-61"> <code class="descname">right_only</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-62">只是<em>b</em> 中的文件和子目录。</span></p></dd></dl><dl class="attribute"><dt id="filecmp.dircmp.common_dirs"><span class="yiyi-st" id="yiyi-63"> <code class="descname">common_dirs</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-64"><em>a</em><em>b</em>中共同的子目录。</span></p></dd></dl><dl class="attribute"><dt id="filecmp.dircmp.common_files"><span class="yiyi-st" id="yiyi-65"> <code class="descname">common_files</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-66"><em>a</em><em>b</em>中的文件。</span></p></dd></dl><dl class="attribute"><dt id="filecmp.dircmp.common_funny"><span class="yiyi-st" id="yiyi-67"> <code class="descname">common_funny</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-68"><em>a</em><em>b</em>中的名称,以使类型在目录之间不同,或<a class="reference internal" href="os.html#os.stat" title="os.stat"><code class="xref py py-func docutils literal"><span class="pre">os.stat()</span></code></a>报告错误的名称。</span></p></dd></dl><dl class="attribute"><dt id="filecmp.dircmp.same_files"><span class="yiyi-st" id="yiyi-69"> <code class="descname">same_files</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-70"><em>a</em><em>b</em>中相同的文件,使用该类的文件比较运算符。</span></p></dd></dl><dl class="attribute"><dt id="filecmp.dircmp.diff_files"><span class="yiyi-st" id="yiyi-71"> <code class="descname">diff_files</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-72"><em>a</em><em>b</em>中,根据该类的文件比较操作符,其内容不同的文件。</span></p></dd></dl><dl class="attribute"><dt id="filecmp.dircmp.funny_files"><span class="yiyi-st" id="yiyi-73"> <code class="descname">funny_files</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-74"><em>a</em><em>b</em>中无法比较的文件。</span></p></dd></dl><dl class="attribute"><dt id="filecmp.dircmp.subdirs"><span class="yiyi-st" id="yiyi-75"> <code class="descname">subdirs</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-76"><a class="reference internal" href="#filecmp.dircmp.common_dirs" title="filecmp.dircmp.common_dirs"><code class="xref py py-attr docutils literal"><span class="pre">common_dirs</span></code></a>中的名称映射到<a class="reference internal" href="#filecmp.dircmp" title="filecmp.dircmp"><code class="xref py py-class docutils literal"><span class="pre">dircmp</span></code></a>对象的字典。</span></p></dd></dl></dd></dl><dl class="attribute"><dt id="filecmp.DEFAULT_IGNORES"><span class="yiyi-st" id="yiyi-77"> <code class="descclassname">filecmp.</code><code class="descname">DEFAULT_IGNORES</code></span></dt><dd><div class="versionadded"><p><span class="yiyi-st" id="yiyi-78"><span class="versionmodified">版本3.4中的新功能。</span></span></p></div><p><span class="yiyi-st" id="yiyi-79">默认情况下,由<a class="reference internal" href="#filecmp.dircmp" title="filecmp.dircmp"><code class="xref py py-class docutils literal"><span class="pre">dircmp</span></code></a>忽略的目录列表。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-80">下面是使用<code class="docutils literal"><span class="pre">subdirs</span></code>属性通过两个目录递归搜索以显示常见的不同文件的简化示例:</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">filecmp</span> <span class="k">import</span> <span class="n">dircmp</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">print_diff_files</span><span class="p">(</span><span class="n">dcmp</span><span class="p">):</span>
<span class="gp">... </span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">dcmp</span><span class="o">.</span><span class="n">diff_files</span><span class="p">:</span>
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s2">"diff_file </span><span class="si">%s</span><span class="s2"> found in </span><span class="si">%s</span><span class="s2"> and </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">dcmp</span><span class="o">.</span><span class="n">left</span><span class="p">,</span>
<span class="gp">... </span> <span class="n">dcmp</span><span class="o">.</span><span class="n">right</span><span class="p">))</span>
<span class="gp">... </span> <span class="k">for</span> <span class="n">sub_dcmp</span> <span class="ow">in</span> <span class="n">dcmp</span><span class="o">.</span><span class="n">subdirs</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
<span class="gp">... </span> <span class="n">print_diff_files</span><span class="p">(</span><span class="n">sub_dcmp</span><span class="p">)</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">dcmp</span> <span class="o">=</span> <span class="n">dircmp</span><span class="p">(</span><span class="s1">'dir1'</span><span class="p">,</span> <span class="s1">'dir2'</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">print_diff_files</span><span class="p">(</span><span class="n">dcmp</span><span class="p">)</span>
</code></pre></div></div></div>