11.3. fileinput — 迭代来自多个输入流的行 — Python 文档

来自菜鸟教程
Python/docs/3.6/library/fileinput
跳转至:导航、​搜索

11.3. 文件输入 — 迭代来自多个输入流的行

源代码: :source:`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))。

空文件被打开并立即关闭; 它们出现在文件名列表中的唯一时间是最后打开的文件为空时。

返回的所有换行符都完好无损,这意味着文件中的最后一行可能没有换行符。

您可以通过 fileinput.input()FileInput()openhook 参数提供一个打开钩子来控制文件的打开方式。 钩子必须是一个函数,它接受两个参数,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 版更改: 可用作上下文管理器。

以下函数使用由 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' 模式。

可选的就地过滤: 如果关键字参数 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 参数。