mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 06:55:36 +08:00
9 lines
22 KiB
HTML
9 lines
22 KiB
HTML
<div class="body" role="main"><div class="section" id="module-fileinput"><h1><span class="yiyi-st" id="yiyi-10">11.3. <a class="reference internal" href="#module-fileinput" title="fileinput: Loop over standard input or a list of files."><code class="xref py py-mod docutils literal"><span class="pre">fileinput</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/fileinput.py">Lib/fileinput.py</a></span></p><p><span class="yiyi-st" id="yiyi-12">该模块实现了一个帮助类和函数,以便通过标准输入或文件列表快速写入一个循环。</span><span class="yiyi-st" id="yiyi-13">如果只想读取或写入一个文件,请参见<a class="reference internal" href="functions.html#open" title="open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a>。</span></p><p><span class="yiyi-st" id="yiyi-14">典型用途是:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">fileinput</span>
|
||
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">fileinput</span><span class="o">.</span><span class="n">input</span><span class="p">():</span>
|
||
<span class="n">process</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-15">如果列表为空,它将遍历<code class="docutils literal"><span class="pre">sys.argv[1:]</span></code>中列出的所有文件行,默认为<code class="docutils literal"><span class="pre">sys.stdin</span></code>。</span><span class="yiyi-st" id="yiyi-16">如果文件名为<code class="docutils literal"><span class="pre">'-'</span></code>,它也将替换为<code class="docutils literal"><span class="pre">sys.stdin</span></code>。</span><span class="yiyi-st" id="yiyi-17">要指定文件名的备用列表,请将其作为第一个参数传递给<a class="reference internal" href="#fileinput.input" title="fileinput.input"><code class="xref py py-func docutils literal"><span class="pre">input()</span></code></a>。</span><span class="yiyi-st" id="yiyi-18">也允许单个文件名。</span></p><p><span class="yiyi-st" id="yiyi-19">默认情况下,所有文件都以文本模式打开,但您可以通过在调用<a class="reference internal" href="#fileinput.input" title="fileinput.input"><code class="xref py py-func docutils literal"><span class="pre">input()</span></code></a>或<a class="reference internal" href="#fileinput.FileInput" title="fileinput.FileInput"><code class="xref py py-class docutils literal"><span class="pre">FileInput</span></code></a>中指定<em>mode</em> 。</span><span class="yiyi-st" id="yiyi-20">如果在打开或读取文件期间发生I / O错误,则会引发<a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a>。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-21"><span class="versionmodified">在版本3.3中更改:</span> <a class="reference internal" href="exceptions.html#IOError" title="IOError"><code class="xref py py-exc docutils literal"><span class="pre">IOError</span></code></a>用于升级;它现在是<a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a>的别名。</span></p></div><p><span class="yiyi-st" id="yiyi-22">如果<code class="docutils literal"><span class="pre">sys.stdin</span></code>多次使用,第二个和进一步的使用将不返回任何行,除非可能是交互式使用,或者如果它已被明确地重置。</span><span class="yiyi-st" id="yiyi-23">使用<code class="docutils literal"><span class="pre">sys.stdin.seek(0)</span></code>)。</span></p><p><span class="yiyi-st" id="yiyi-24">空文件打开并立即关闭;他们在文件名列表中的存在唯一明显的时候是最后打开的文件是空的。</span></p><p><span class="yiyi-st" id="yiyi-25">返回的所有换行符都保持不变,这意味着文件中的最后一行可能没有一行。</span></p><p><span class="yiyi-st" id="yiyi-26">您可以通过<em>openhook</em>参数向<a class="reference internal" href="#fileinput.input" title="fileinput.input"><code class="xref py py-func docutils literal"><span class="pre">fileinput.input()</span></code></a>或<a class="reference internal" href="#fileinput.FileInput" title="fileinput.FileInput"><code class="xref py py-class docutils literal"><span class="pre">FileInput()</span></code></a>提供打开钩子来控制文件的打开方式。</span><span class="yiyi-st" id="yiyi-27">钩子必须是一个接受两个参数<em>filename</em>和<em>模式</em>的函数,并返回一个相应打开的类文件对象。</span><span class="yiyi-st" id="yiyi-28">该模块已经提供了两个有用的挂钩。</span></p><p><span class="yiyi-st" id="yiyi-29">以下功能是此模块的主要接口:</span></p><dl class="function"><dt id="fileinput.input"><span class="yiyi-st" id="yiyi-30"> <code class="descclassname">fileinput.</code><code class="descname">input</code><span class="sig-paren">(</span><em>files=None</em>, <em>inplace=False</em>, <em>backup=''</em>, <em>bufsize=0</em>, <em>mode='r'</em>, <em>openhook=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-31">创建<a class="reference internal" href="#fileinput.FileInput" title="fileinput.FileInput"><code class="xref py py-class docutils literal"><span class="pre">FileInput</span></code></a>类的实例。</span><span class="yiyi-st" id="yiyi-32">实例将用作此模块的函数的全局状态,并在迭代期间返回使用。</span><span class="yiyi-st" id="yiyi-33">此函数的参数将传递到<a class="reference internal" href="#fileinput.FileInput" title="fileinput.FileInput"><code class="xref py py-class docutils literal"><span class="pre">FileInput</span></code></a>类的构造函数。</span></p><p><span class="yiyi-st" id="yiyi-34"><a class="reference internal" href="#fileinput.FileInput" title="fileinput.FileInput"><code class="xref py py-class docutils literal"><span class="pre">FileInput</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><span class="yiyi-st" id="yiyi-35">在此示例中,即使发生异常,<em>输入</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">fileinput</span><span class="o">.</span><span class="n">input</span><span class="p">(</span><span class="n">files</span><span class="o">=</span><span class="p">(</span><span class="s1">'spam.txt'</span><span class="p">,</span> <span class="s1">'eggs.txt'</span><span class="p">))</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
||
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">f</span><span class="p">:</span>
|
||
<span class="n">process</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
|
||
</code></pre><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-36"><span class="versionmodified">在版本3.2中更改:</span>可用作上下文管理器。</span></p></div><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-37"><span class="versionmodified">在3.5.2版中已更改:</span>不再使用<em>bufsize</em>参数。</span></p></div></dd></dl><p><span class="yiyi-st" id="yiyi-38">以下函数使用由<a class="reference internal" href="#fileinput.input" title="fileinput.input"><code class="xref py py-func docutils literal"><span class="pre">fileinput.input()</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><dl class="function"><dt id="fileinput.filename"><span class="yiyi-st" id="yiyi-39"> <code class="descclassname">fileinput.</code><code class="descname">filename</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-40">返回当前正在读取的文件的名称。</span><span class="yiyi-st" id="yiyi-41">在读取第一行之前,返回<code class="docutils literal"><span class="pre">None</span></code>。</span></p></dd></dl><dl class="function"><dt id="fileinput.fileno"><span class="yiyi-st" id="yiyi-42"> <code class="descclassname">fileinput.</code><code class="descname">fileno</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-43">为当前文件返回整数“file描述器”。</span><span class="yiyi-st" id="yiyi-44">当没有打开文件时(第一行之前和文件之间),返回<code class="docutils literal"><span class="pre">-1</span></code>。</span></p></dd></dl><dl class="function"><dt id="fileinput.lineno"><span class="yiyi-st" id="yiyi-45"> <code class="descclassname">fileinput.</code><code class="descname">lineno</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-46">返回刚刚读取的行的累积行号。</span><span class="yiyi-st" id="yiyi-47">在读取第一行之前,返回<code class="docutils literal"><span class="pre">0</span></code>。</span><span class="yiyi-st" id="yiyi-48">在读取最后一个文件的最后一行之后,返回该行的行号。</span></p></dd></dl><dl class="function"><dt id="fileinput.filelineno"><span class="yiyi-st" id="yiyi-49"> <code class="descclassname">fileinput.</code><code class="descname">filelineno</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-50">返回当前文件中的行号。</span><span class="yiyi-st" id="yiyi-51">在读取第一行之前,返回<code class="docutils literal"><span class="pre">0</span></code>。</span><span class="yiyi-st" id="yiyi-52">在读取最后一个文件的最后一行之后,返回文件中该行的行号。</span></p></dd></dl><dl class="function"><dt id="fileinput.isfirstline"><span class="yiyi-st" id="yiyi-53"> <code class="descclassname">fileinput.</code><code class="descname">isfirstline</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-54">如果刚刚读取的行是其文件的第一行,则返回true,否则返回false。</span></p></dd></dl><dl class="function"><dt id="fileinput.isstdin"><span class="yiyi-st" id="yiyi-55"> <code class="descclassname">fileinput.</code><code class="descname">isstdin</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-56">如果最后一行从<code class="docutils literal"><span class="pre">sys.stdin</span></code>中读取,则返回true,否则返回false。</span></p></dd></dl><dl class="function"><dt id="fileinput.nextfile"><span class="yiyi-st" id="yiyi-57"> <code class="descclassname">fileinput.</code><code class="descname">nextfile</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-58">关闭当前文件,以便下一次迭代将从下一个文件读取第一行(如果有的话);未从文件读取的行不会计入累积行计数。</span><span class="yiyi-st" id="yiyi-59">直到读取下一个文件的第一行之后,文件名才会更改。</span><span class="yiyi-st" id="yiyi-60">在读取第一行之前,此函数没有效果;它不能用于跳过第一个文件。</span><span class="yiyi-st" id="yiyi-61">在读取最后一个文件的最后一行之后,此函数没有效果。</span></p></dd></dl><dl class="function"><dt id="fileinput.close"><span class="yiyi-st" id="yiyi-62"> <code class="descclassname">fileinput.</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-63">关闭序列。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-64">实现模块提供的序列行为的类也可用于子类化:</span></p><dl class="class"><dt id="fileinput.FileInput"><span class="yiyi-st" id="yiyi-65"> <em class="property">class </em><code class="descclassname">fileinput.</code><code class="descname">FileInput</code><span class="sig-paren">(</span><em>files=None</em>, <em>inplace=False</em>, <em>backup=''</em>, <em>bufsize=0</em>, <em>mode='r'</em>, <em>openhook=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-66">类<a class="reference internal" href="#fileinput.FileInput" title="fileinput.FileInput"><code class="xref py py-class docutils literal"><span class="pre">FileInput</span></code></a>是实现;其方法<a class="reference internal" href="#fileinput.filename" title="fileinput.filename"><code class="xref py py-meth docutils literal"><span class="pre">filename()</span></code></a>,<a class="reference internal" href="#fileinput.fileno" title="fileinput.fileno"><code class="xref py py-meth docutils literal"><span class="pre">fileno()</span></code></a>,<a class="reference internal" href="#fileinput.lineno" title="fileinput.lineno"><code class="xref py py-meth docutils literal"><span class="pre">lineno()</span></code></a>,<a class="reference internal" href="#fileinput.filelineno" title="fileinput.filelineno"><code class="xref py py-meth docutils literal"><span class="pre">filelineno()</span></code></a>,<a class="reference internal" href="#fileinput.isfirstline" title="fileinput.isfirstline"><code class="xref py py-meth docutils literal"><span class="pre">isfirstline()</span></code></a>,<a class="reference internal" href="#fileinput.isstdin" title="fileinput.isstdin"><code class="xref py py-meth docutils literal"><span class="pre">isstdin()</span></code></a>,<a class="reference internal" href="#fileinput.nextfile" title="fileinput.nextfile"><code class="xref py py-meth docutils literal"><span class="pre">nextfile()</span></code></a>和<a class="reference internal" href="#fileinput.close" title="fileinput.close"><code class="xref py py-meth docutils literal"><span class="pre">close()</span></code></a>对应于模块中同名的函数。</span><span class="yiyi-st" id="yiyi-67">此外,它具有返回下一个输入行的<a class="reference internal" href="io.html#io.TextIOBase.readline" title="io.TextIOBase.readline"><code class="xref py py-meth docutils literal"><span class="pre">readline()</span></code></a>方法和实现序列行为的<a class="reference internal" href="../reference/datamodel.html#object.__getitem__" title="object.__getitem__"><code class="xref py py-meth docutils literal"><span class="pre">__getitem__()</span></code></a>方法。</span><span class="yiyi-st" id="yiyi-68">必须以严格顺序的顺序访问序列;随机存取和<a class="reference internal" href="io.html#io.TextIOBase.readline" title="io.TextIOBase.readline"><code class="xref py py-meth docutils literal"><span class="pre">readline()</span></code></a>不能混合。</span></p><p><span class="yiyi-st" id="yiyi-69">使用<em>模式</em>,您可以指定将传递到<a class="reference internal" href="functions.html#open" title="open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a>的文件模式。</span><span class="yiyi-st" id="yiyi-70">它必须是<code class="docutils literal"><span class="pre">'r'</span></code>,<code class="docutils literal"><span class="pre">'rU'</span></code>,<code class="docutils literal"><span class="pre">'U'</span></code>和<code class="docutils literal"><span class="pre">'rb'</span></code>之一。</span></p><p><span class="yiyi-st" id="yiyi-71">给定时,<em>openhook</em>必须是采用两个参数<em>filename</em>和<em>模式</em>的函数,并返回相应打开的类文件对象。</span><span class="yiyi-st" id="yiyi-72">您不能同时使用<em>inplace</em>和<em>openhook</em>。</span></p><p><span class="yiyi-st" id="yiyi-73"><a class="reference internal" href="#fileinput.FileInput" title="fileinput.FileInput"><code class="xref py py-class docutils literal"><span class="pre">FileInput</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><span class="yiyi-st" id="yiyi-74">在此示例中,即使发生异常,<em>输入</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">FileInput</span><span class="p">(</span><span class="n">files</span><span class="o">=</span><span class="p">(</span><span class="s1">'spam.txt'</span><span class="p">,</span> <span class="s1">'eggs.txt'</span><span class="p">))</span> <span class="k">as</span> <span class="nb">input</span><span class="p">:</span>
|
||
<span class="n">process</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span>
|
||
</code></pre><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-75"><span class="versionmodified">在版本3.2中更改:</span>可用作上下文管理器。</span></p></div><div class="deprecated"><p><span class="yiyi-st" id="yiyi-76"><span class="versionmodified">自版本3.4之后已弃用:</span> <code class="docutils literal"><span class="pre">'rU'</span></code>和<code class="docutils literal"><span class="pre">'U'</span></code>模式。</span></p></div><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-77"><span class="versionmodified">在3.5.2版中已更改:</span>不再使用<em>bufsize</em>参数。</span></p></div></dd></dl><p><span class="yiyi-st" id="yiyi-78"><strong>可选的内部过滤:</strong>如果关键字参数<code class="docutils literal"><span class="pre">inplace=True</span></code>传递给<a class="reference internal" href="#fileinput.input" title="fileinput.input"><code class="xref py py-func docutils literal"><span class="pre">fileinput.input()</span></code></a>或<a class="reference internal" href="#fileinput.FileInput" title="fileinput.FileInput"><code class="xref py py-class docutils literal"><span class="pre">FileInput</span></code></a></span><span class="yiyi-st" id="yiyi-79">这使得可以写入一个在其位置重写其输入文件的过滤器。</span><span class="yiyi-st" id="yiyi-80">如果给出了<em>backup</em>参数(通常为<code class="docutils literal"><span class="pre">backup ='。 <span class="pre">扩展名>'</span> 指定备份文件的扩展名,备份文件保留;默认情况下,扩展名为<code class="docutils literal"><span class="pre">'.bak'</span></code>,并且在输出文件关闭时被删除。</span></code></span><span class="yiyi-st" id="yiyi-81">当读取标准输入时,禁用就地过滤。</span></p><p><span class="yiyi-st" id="yiyi-82">该模块提供以下两个打开钩:</span></p><dl class="function"><dt id="fileinput.hook_compressed"><span class="yiyi-st" id="yiyi-83"> <code class="descclassname">fileinput.</code><code class="descname">hook_compressed</code><span class="sig-paren">(</span><em>filename</em>, <em>mode</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-84">Transparently opens files compressed with gzip and bzip2 (recognized by the extensions <code class="docutils literal"><span class="pre">'.gz'</span></code> and <code class="docutils literal"><span class="pre">'.bz2'</span></code>) using the <a class="reference internal" href="gzip.html#module-gzip" title="gzip: Interfaces for gzip compression and decompression using file objects."><code class="xref py py-mod docutils literal"><span class="pre">gzip</span></code></a> and <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> modules. </span><span class="yiyi-st" id="yiyi-85">如果文件扩展名不是<code class="docutils literal"><span class="pre">'.gz'</span></code>或<code class="docutils literal"><span class="pre">'.bz2'</span></code>,则文件将正常打开(即使用<a class="reference internal" href="functions.html#open" title="open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-86">使用示例:<code class="docutils literal"><span class="pre">fi</span> <span class="pre">=</span> <span class="pre">fileinput.FileInput(openhook = fileinput.hook_compressed)</span></code></span></p></dd></dl><dl class="function"><dt id="fileinput.hook_encoded"><span class="yiyi-st" id="yiyi-87"> <code class="descclassname">fileinput.</code><code class="descname">hook_encoded</code><span class="sig-paren">(</span><em>encoding</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-88">返回使用<a class="reference internal" href="functions.html#open" title="open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a>打开每个文件的钩子,使用给定的<em>编码</em>读取文件。</span></p><p><span class="yiyi-st" id="yiyi-89">使用示例:<code class="docutils literal"><span class="pre">fi</span> <span class="pre">=</span> <span class="pre">fileinput.FileInput(openhook = fileinput.hook_encoded(“iso-8859-1”)) t0></span></code></span></p></dd></dl></div></div> |