Skip to main content

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() 提供打开挂钩来控制文件的打开方式。钩子必须是一个接受两个参数 filenamemode 的函数,并返回一个相应打开的类文件对象。该模块已经提供了两个有用的钩子。

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

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

创建 FileInput 类的实例。该实例将用作此模块的函数的全局状态,并且在迭代期间也返回使用。该函数的参数将被传递给 FileInput 类的构造函数。

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

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

在 3.2 版更改: 可以用作上下文管理器。

从版本3.6开始弃用,将在版本3.8中删除:bufsize参数。

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

fileinput.filename()

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

fileinput.fileno()

返回当前文件的整数“文件描述符”。当没有打开文件时(第一行之前和文件之间),返回 -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() 不能混合。

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

openhook,当给定时,必须是一个函数,它接受两个参数,filenamemode,并返回一个相应打开的类文件对象。您不能一起使用 inplaceopenhook

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

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

在 3.2 版更改: 可以用作上下文管理器。

3.4 版后已移除: 'rU''U' 模式。

从版本3.6开始弃用,将在版本3.8中删除:bufsize参数。

可选的就地过滤: 如果关键字参数 inplace=True 被传递给 fileinput.input()FileInput 构造函数,则文件被移动到备份文件,标准输出被定向到输入文件(如果与备份文件名称相同的文件已经存在,静默替换)。这使得可以编写一个在其位置重写其输入文件的过滤器。如果给出 backup 参数(通常为 backup='.<some extension>'),则它指定备份文件的扩展名,并且备份文件保留;默认情况下,扩展名是 '.bak',并且在输出文件关闭时被删除。当读取标准输入时,禁用就地过滤。

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

fileinput.hook_compressed(filename, mode)

使用 gzipbz2 模块透明地打开使用gzip和bzip2压缩的文件(由扩展 '.gz''.bz2' 识别)。如果文件扩展名不是 '.gz''.bz2',文件将正常打开(即,使用 open() 没有任何解压缩)。

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

fileinput.hook_encoded(encoding, errors=None)

返回一个钩子,用 open() 打开每个文件,使用给定的 encodingerrors 读取文件。

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

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