2019-04-21 11:50:48 +08:00

17 lines
11 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-glob"><h1><span class="yiyi-st" id="yiyi-10">11.7. <a class="reference internal" href="#module-glob" title="glob: Unix shell style pathname pattern expansion."><code class="xref py py-mod docutils literal"><span class="pre">glob</span></code></a> — Unix风格的路径名匹配</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/glob.py">Lib/glob.py</a></span></p><p><span class="yiyi-st" id="yiyi-12"><a class="reference internal" href="#module-glob" title="glob: Unix shell style pathname pattern expansion."><code class="xref py py-mod docutils literal"><span class="pre">glob</span></code></a> 模块使用一个Unix shell规则的字符串查找与其匹配的所有路径, 但返回的结果是无序的。</span><span class="yiyi-st" id="yiyi-13">支持除波浪号~之外的其他符号,如<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>包裹的字符范围。</span><span class="yiyi-st" id="yiyi-14">此函数内部使用了<a class="reference internal" href="os.html#os.listdir" title="os.listdir"><code class="xref py py-func docutils literal"><span class="pre">os.listdir()</span></code></a><a class="reference internal" href="fnmatch.html#fnmatch.fnmatch" title="fnmatch.fnmatch"><code class="xref py py-func docutils literal"><span class="pre">fnmatch.fnmatch()</span></code></a>实现而没有真正调用一个shell。</span><span class="yiyi-st" id="yiyi-15">请注意,与<a class="reference internal" href="fnmatch.html#fnmatch.fnmatch" title="fnmatch.fnmatch"><code class="xref py py-func docutils literal"><span class="pre">fnmatch.fnmatch()</span></code></a>不同的是,<a class="reference internal" href="#module-glob" title="glob: Unix shell style pathname pattern expansion."><code class="xref py py-mod docutils literal"><span class="pre">glob</span></code></a>将文件路径以点(<code class="docutils literal"><span class="pre">.</span></code>)开头视为一个特殊情况。</span><span class="yiyi-st" id="yiyi-16">(对于波浪号扩展和shell变量扩展使用 <a class="reference internal" href="os.path.html#os.path.expanduser" title="os.path.expanduser"><code class="xref py py-func docutils literal"><span class="pre">os.path.expanduser()</span></code></a><a class="reference internal" href="os.path.html#os.path.expandvars" title="os.path.expandvars"><code class="xref py py-func docutils literal"><span class="pre">os.path.expandvars()</span></code></a>。)</span></p><p><span class="yiyi-st" id="yiyi-17">如果想匹配转义符本身,将转义符用方括号包裹。</span><span class="yiyi-st" id="yiyi-18">例如, <code class="docutils literal"><span class="pre">'[?]'</span></code></span><span class="yiyi-st" id="yiyi-19">将匹配字符 <code class="docutils literal"><span class="pre">'?'</span></code></span></p><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-20">参见</span></p><p class="last"><span class="yiyi-st" id="yiyi-21"><a class="reference internal" href="pathlib.html#module-pathlib" title="pathlib: Object-oriented filesystem paths"><code class="xref py py-mod docutils literal"><span class="pre">pathlib</span></code></a>模块提供高级的路径对象处理。</span></p></div><dl class="function"><dt id="glob.glob"><span class="yiyi-st" id="yiyi-22"> <code class="descclassname">glob.</code><code class="descname">glob</code><span class="sig-paren">(</span><em>pathname</em>, <em>*</em>, <em>recursive=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-23">返回一个与<em>pathname</em>匹配的路径组成的list该list可能为空。 该参数必须为包含路径说明的字符串。</span><span class="yiyi-st" id="yiyi-24"><em>pathname</em> 可以为绝对路径 (like <code class="file docutils literal"><span class="pre">/usr/src/Python-1.5/Makefile</span></code>) 或相对路径 (like <code class="file docutils literal"><span class="pre">../../Tools/*/*.gif</span></code>), 并且可以包含shell风格的通配符。</span><span class="yiyi-st" id="yiyi-25">损坏的符号链接将被包含在结果中 (类似于shell中)。</span></p><p><span class="yiyi-st" id="yiyi-26">如果 <em>recursive</em> 设置为真,“<code class="docutils literal"><span class="pre">**</span></code>” 将匹配所有存在的目录和子目录和任何文件。</span><span class="yiyi-st" id="yiyi-27">如果匹配式以 <code class="docutils literal"><span class="pre">os.sep</span></code> 结尾, 只对目录和子目录进行匹配。</span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-28">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-29">在一个大型目录树中使用 “<code class="docutils literal"><span class="pre">**</span></code>” 可能会消耗过多的时间。</span></p></div><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-30"><span class="versionmodified">版本3.5中修改:</span>支持启用递归时使用 “<code class="docutils literal"><span class="pre">**</span></code>”。</span></p></div></dd></dl><dl class="function"><dt id="glob.iglob"><span class="yiyi-st" id="yiyi-31"> <code class="descclassname">glob.</code><code class="descname">iglob</code><span class="sig-paren">(</span><em>pathname</em>, <em>recursive=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-32">返回一个 <a class="reference internal" href="../glossary.html#term-iterator"><span class="xref std std-term">iterator</span></a> 迭代器,它产生与 <a class="reference internal" href="#module-glob" title="glob: Unix shell style pathname pattern expansion."><code class="xref py py-func docutils literal"><span class="pre">glob()</span></code></a> 相同的结果,但同时不会存储它们。</span></p></dd></dl><dl class="function"><dt id="glob.escape"><span class="yiyi-st" id="yiyi-33"> <code class="descclassname">glob.</code><code class="descname">escape</code><span class="sig-paren">(</span><em>pathname</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-34">转义所有的特殊字符(<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>])。</span><span class="yiyi-st" id="yiyi-35">如果您想匹配任意可能包含特殊字符的字符串,这将非常有用。</span><span class="yiyi-st" id="yiyi-36">驱动器/ UNC共享点中的特殊字符不会转义例如</span><span class="yiyi-st" id="yiyi-37">在Windows系统上 <code class="docutils literal"><span class="pre">escape('//?/c:/Quo</span> <span class="pre">vadis?.txt')</span></code> 将返回 <code class="docutils literal"><span class="pre">'//?/c:/Quo</span> <span class="pre">vadis[?].txt'</span></code></span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-38"><span class="versionmodified">版本3.4中新增。</span></span></p></div></dd></dl><p><span class="yiyi-st" id="yiyi-39">例如,一个包含以下文件的目录:<code class="file docutils literal"><span class="pre">1.gif</span></code><code class="file docutils literal"><span class="pre">2.txt</span></code><code class="file docutils literal"><span class="pre">card.gif</span></code>,目录中还有一子目录<code class="file docutils literal"><span class="pre">sub</span></code>其中只包含文件<code class="file docutils literal"><span class="pre">3.txt</span></code></span><span class="yiyi-st" id="yiyi-40"><a class="reference internal" href="#module-glob" title="glob: Unix shell style pathname pattern expansion."><code class="xref py py-func docutils literal"><span class="pre">glob()</span></code></a>将产生以下结果。</span><span class="yiyi-st" id="yiyi-41">注意如何保留路径的任何前导组件。</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">glob</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s1">'./[0-9].*'</span><span class="p">)</span>
<span class="go">['./1.gif', './2.txt']</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s1">'*.gif'</span><span class="p">)</span>
<span class="go">['1.gif', 'card.gif']</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s1">'?.gif'</span><span class="p">)</span>
<span class="go">['1.gif']</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s1">'**/*.txt'</span><span class="p">,</span> <span class="n">recursive</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="go">['2.txt', 'sub/3.txt']</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s1">'./**/'</span><span class="p">,</span> <span class="n">recursive</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="go">['./', './sub/']</span>
</code></pre><p><span class="yiyi-st" id="yiyi-42">如果目录包含以<code class="docutils literal"><span class="pre">.</span></code>开头的文件。</span><span class="yiyi-st" id="yiyi-43">默认将不会匹配到它们。</span><span class="yiyi-st" id="yiyi-44">例如,一个包含<code class="file docutils literal"><span class="pre">card.gif</span></code><code class="file docutils literal"><span class="pre">.card.gif</span></code>的目录:</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">glob</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s1">'*.gif'</span><span class="p">)</span>
<span class="go">['card.gif']</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s1">'.c*'</span><span class="p">)</span>
<span class="go">['.card.gif']</span>
</code></pre><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-45">参见</span></p><dl class="last docutils"><dt><span class="yiyi-st" id="yiyi-46">模块 <a class="reference internal" href="fnmatch.html#module-fnmatch" title="fnmatch: Unix shell style filename pattern matching."><code class="xref py py-mod docutils literal"><span class="pre">fnmatch</span></code></a></span></dt><dd><span class="yiyi-st" id="yiyi-47">Shell风格的文件名而不是路径扩展</span></dd></dl></div></div></div>