# 11.3. `fileinput` — 从多个输入流迭代

源代码: Lib/fileinput.py

该模块实现了一个帮助类和函数，以便通过标准输入或文件列表快速写入一个循环。如果只想读取或写入一个文件，请参见`open()`。

典型用途是：

    import fileinput
    for line in fileinput.input():
        process(line)

如果列表为空，它将遍历`sys.argv[1:]`中列出的所有文件行，默认为`sys.stdin`。如果文件名为`'-'`，它也将替换为`sys.stdin`。要指定文件名的备用列表，请将其作为第一个参数传递给`input()`。也允许单个文件名。

默认情况下，所有文件都以文本模式打开，但您可以通过在调用`input()`或`FileInput`中指定mode 。如果在打开或读取文件期间发生I / O错误，则会引发`OSError`。

在版本3.3中更改： `IOError`用于升级；它现在是`OSError`的别名。

如果`sys.stdin`多次使用，第二个和进一步的使用将不返回任何行，除非可能是交互式使用，或者如果它已被明确地重置。使用`sys.stdin.seek(0)`）。

空文件打开并立即关闭；他们在文件名列表中的存在唯一明显的时候是最后打开的文件是空的。

返回的所有换行符都保持不变，这意味着文件中的最后一行可能没有一行。

您可以通过openhook参数向`fileinput.input()`或`FileInput()`提供打开钩子来控制文件的打开方式。钩子必须是一个接受两个参数filename和模式的函数，并返回一个相应打开的类文件对象。该模块已经提供了两个有用的挂钩。

以下功能是此模块的主要接口：

`fileinput.``input`(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)

  创建`FileInput`类的实例。实例将用作此模块的函数的全局状态，并在迭代期间返回使用。此函数的参数将传递到`FileInput`类的构造函数。

  `FileInput`实例可用作`with`语句中的上下文管理器。在此示例中，即使发生异常，输入在退出`with`

      with fileinput.input(files=('spam.txt', 'eggs.txt')) as f:
          for line in f:
              process(line)

  在版本3.2中更改：可用作上下文管理器。

  在3.5.2版中已更改：不再使用bufsize参数。

以下函数使用由`fileinput.input()`创建的全局状态；如果没有活动状态，则会引发`RuntimeError`。

`fileinput.``filename`()

  返回当前正在读取的文件的名称。在读取第一行之前，返回`None`。

`fileinput.``fileno`()

  为当前文件返回整数“file描述器”。当没有打开文件时（第一行之前和文件之间），返回`-1`。

`fileinput.``lineno`()

  返回刚刚读取的行的累积行号。在读取第一行之前，返回`0`。在读取最后一个文件的最后一行之后，返回该行的行号。

`fileinput.``filelineno`()

  返回当前文件中的行号。在读取第一行之前，返回`0`。在读取最后一个文件的最后一行之后，返回文件中该行的行号。

`fileinput.``isfirstline`()

  如果刚刚读取的行是其文件的第一行，则返回true，否则返回false。

`fileinput.``isstdin`()

  如果最后一行从`sys.stdin`中读取，则返回true，否则返回false。

`fileinput.``nextfile`()

  关闭当前文件，以便下一次迭代将从下一个文件读取第一行（如果有的话）；未从文件读取的行不会计入累积行计数。直到读取下一个文件的第一行之后，文件名才会更改。在读取第一行之前，此函数没有效果；它不能用于跳过第一个文件。在读取最后一个文件的最后一行之后，此函数没有效果。

`fileinput.``close`()

  关闭序列。

实现模块提供的序列行为的类也可用于子类化：

class `fileinput.``FileInput`(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)

  类`FileInput`是实现；其方法`filename()`，`fileno()`，`lineno()`，`filelineno()`，`isfirstline()`，`isstdin()`，`nextfile()`和`close()`对应于模块中同名的函数。此外，它具有返回下一个输入行的`readline()`方法和实现序列行为的`__getitem__()`方法。必须以严格顺序的顺序访问序列；随机存取和`readline()`不能混合。

  使用模式，您可以指定将传递到`open()`的文件模式。它必须是`'r'`，`'rU'`，`'U'`和`'rb'`之一。

  给定时，openhook必须是采用两个参数filename和模式的函数，并返回相应打开的类文件对象。您不能同时使用inplace和openhook。

  `FileInput`实例可用作`with`语句中的上下文管理器。在此示例中，即使发生异常，输入在退出`with`

      with FileInput(files=('spam.txt', 'eggs.txt')) as input:
          process(input)

  在版本3.2中更改：可用作上下文管理器。

  自版本3.4之后已弃用： `'rU'`和`'U'`模式。

  在3.5.2版中已更改：不再使用bufsize参数。

可选的内部过滤：如果关键字参数`inplace=True`传递给`fileinput.input()`或`FileInput` 这使得可以写入一个在其位置重写其输入文件的过滤器。如果给出了backup参数（通常为`backup ='。 扩展名>' 指定备份文件的扩展名，备份文件保留；默认情况下，扩展名为`'.bak'`，并且在输出文件关闭时被删除。`当读取标准输入时，禁用就地过滤。

该模块提供以下两个打开钩：

`fileinput.``hook_compressed`(filename, mode)

  Transparently opens files compressed with gzip and bzip2 (recognized by the extensions `'.gz'` and `'.bz2'`) using the `gzip` and `bz2` modules. 如果文件扩展名不是`'.gz'`或`'.bz2'`，则文件将正常打开（即使用`open()`

  使用示例：`fi = fileinput.FileInput（openhook = fileinput.hook_compressed）`

`fileinput.``hook_encoded`(encoding)

  返回使用`open()`打开每个文件的钩子，使用给定的编码读取文件。

  使用示例：`fi = fileinput.FileInput（openhook = fileinput.hook_encoded（“iso-8859-1”）） t0>`