mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 23:14:06 +08:00
11 lines
16 KiB
HTML
11 lines
16 KiB
HTML
<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">>>> </span><span class="kn">from</span> <span class="nn">filecmp</span> <span class="k">import</span> <span class="n">dircmp</span>
|
||
<span class="gp">>>> </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">>>> </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">>>> </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> |