fileinput —遍历来自多个 Importing 流的行

源代码: Lib/fileinput.py


该模块实现了一个帮助器类,并具有在标准 Importing 或文件列表上快速编写循环的Function。如果您只想读取或写入一个文件,请参见open()

典型的用法是:

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

这会在sys.argv[1:]中列出的所有文件的行上进行迭代,如果列表为空,则默认为sys.stdin。如果文件名是'-',它也会被sys.stdin替换,并且可选参数* mode openhook *将被忽略。要指定文件名的替代列表,请将其作为第一个参数传递给input()。也允许使用单个文件名。

默认情况下,所有文件都以文本模式打开,但是您可以pass在对input()FileInput的调用中指定* mode *参数来覆盖此文件。如果在打开或读取文件期间发生 I/O 错误,则会引发OSError

在版本 3.3 中更改:IOError曾经被提出过;现在是OSError的别名。

如果sys.stdin被多次使用,则第二次及以后的使用将不返回任何行,除非是交互式使用,或者已被明确重置(例如,使用sys.stdin.seek(0))。

空文件被打开并立即关闭;只有在最后一个打开的文件为空时,它们在文件名列表中的存在才是显而易见的。

返回的行将完整保留所有换行符,这意味着文件中的最后一行可能没有一行。

您可以passfileinput.input()FileInput()的* openhook 参数提供一个打开钩子来控制文件的打开方式。该钩子必须是一个带有两个参数 filename mode *的函数,并返回相应打开的类似文件的对象。该模块已经提供了两个有用的钩子。

以下Function是此模块的主要接口:

  • fileinput. input(* files = None inplace = False backup =''**,* mode ='r' openhook = None *)
    • 创建一个FileInput类的实例。该实例将用作此模块Function的全局状态,并且在迭代过程中也将恢复使用。该函数的参数将传递给FileInput类的构造函数。

FileInput实例可以在with语句中用作上下文 Management 器。在此示例中,即使退出with语句,也将关闭* input *,即使发生异常:

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

在版本 3.2 中更改:可以用作上下文 Management 器。

在版本 3.8 中更改:关键字参数* mode openhook *现在仅用作关键字。

以下函数使用fileinput.input()创建的全局状态;如果没有活动状态,则引发RuntimeError

  • fileinput. filename ( )

    • 返回当前正在读取的文件的名称。在读取第一行之前,返回None
  • fileinput. fileno ( )

    • 返回当前文件的整数“文件 Descriptors”。如果没有打开文件(在第一行之前和文件之间),则返回-1
  • fileinput. lineno ( )

    • 返回刚刚读取的行的累积行号。在读取第一行之前,返回0。读取最后一个文件的最后一行后,返回该行的行号。
  • fileinput. filelineno ( )

    • 返回当前文件中的行号。在读取第一行之前,返回0。读取最后一个文件的最后一行后,返回文件中该行的行号。
  • fileinput. isfirstline ( )

    • 如果刚读取的行是文件的第一行,则返回True,否则返回False
  • fileinput. isstdin ( )

    • 如果从sys.stdin读取了最后一行,则返回True,否则返回False
  • fileinput. nextfile ( )

    • 关闭当前文件,以便下一次迭代将从下一个文件(如果有)中读取第一行;未从文件中读取的行将不会计入累积行数。在读取下一个文件的第一行之前,文件名不会更改。在读取第一行之前,此Function无效。它不能用于跳过第一个文件。读取最后一个文件的最后一行后,此Function无效。
  • fileinput. close ( )

    • 关闭序列。

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

使用* mode *,您可以指定将哪种文件模式传递给open()。它必须是'r''rU''U''rb'之一。

如果给定了* openhook ,它必须是一个带有两个参数 filename mode 的函数,并返回相应打开的类似文件的对象。您不能同时使用 inplace openhook *。

FileInput实例可以在with语句中用作上下文 Management 器。在此示例中,即使退出with语句,也将关闭* input *,即使发生异常:

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

在版本 3.2 中更改:可以用作上下文 Management 器。

从 3.4 版开始不推荐使用:'rU''U'模式。

从 3.8 版开始不推荐使用:不支持getitem()方法。

在版本 3.8 中更改:关键字参数* mode openhook *现在仅用作关键字。

可选的就地过滤: 如果将关键字参数inplace=True传递给fileinput.input()FileInput构造函数,则该文件将移至备份文件,并且标准输出将定向到 Importing 文件(如果文件名称相同)因为备份文件已经存在,它将被静默替换)。这样就可以编写一个过滤器,该过滤器可以在原处重写其 Importing 文件。如果给定了* backup *参数(通常为backup='.<some extension>'),则它指定备份文件的 extensions,并且备份文件仍然存在。默认情况下,extensions 是'.bak',并且在关闭输出文件时将其删除。读取标准 Importing 时,将禁用就地过滤。

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

  • fileinput. hook_compressed(* filename mode *)
    • 使用gzipbz2模块透明地打开使用 gzip 和 bzip2(由 extensions'.gz''.bz2'识别)压缩的文件。如果文件 extensions 不是'.gz''.bz2',则文件将正常打开(即,使用open()而不进行任何解压缩)。

用法示例:fi = fileinput.FileInput(openhook=fileinput.hook_compressed)

  • fileinput. hook_encoded(* encoding errors = None *)
    • 返回一个钩子,该钩子使用open()打开每个文件,并使用给定的* encoding errors *读取文件。

用法示例:fi = fileinput.FileInput(openhook=fileinput.hook_encoded("utf-8", "surrogateescape"))

在 3.6 版中进行了更改:添加了可选的* errors *参数。