fileinput ---重复来自多个输入流的行

源代码: Lib/fileinput.py


此模块实现一个助手类和函数,以快速地在标准输入或文件列表上编写循环。如果您只想读取或写入一个文件,请参阅 open() .

典型用途是:

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

这将遍历中列出的所有文件的行。 sys.argv[1:] ,默认为 sys.stdin 如果列表为空。如果文件名是 '-' ,它也被替换为 sys.stdin 以及可选参数 mode开口钩 被忽略。要指定文件名的可选列表,请将其作为第一个参数传递给 input() . 也允许使用单个文件名。

默认情况下,所有文件都以文本模式打开,但可以通过指定 mode 调用中的参数 input()FileInput . 如果在打开或读取文件时发生I/O错误, OSError 提高了。

在 3.3 版更改: IOError 以前是被引发的;现在它是 OSError .

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

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

返回的行中有完整的新行,这意味着文件中的最后一行可能没有新行。

您可以通过提供一个打开钩子来控制如何打开文件 开口钩 参数到 fileinput.input()FileInput() . 钩子必须是一个接受两个参数的函数, filenamemode ,并返回相应打开的类似对象的文件。这个模块已经提供了两个有用的钩子。

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

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

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

这个 FileInput 实例可以用作 with 语句。在这个例子中, inputwith 语句已退出,即使发生异常::

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

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

在 3.8 版更改: 关键字参数 mode开口钩 现在只显示关键字。

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

fileinput.filename()

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

fileinput.fileno()

返回当前文件的整数“文件描述符”。当没有打开任何文件时(在第一行之前和文件之间),返回 -1 .

fileinput.lineno()

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

fileinput.filelineno()

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

fileinput.isfirstline()

返回 True 如果刚读取的行是其文件的第一行,则返回 False .

fileinput.isstdin()

返回 True 如果最后一行是从 sys.stdin ,否则返回 False .

fileinput.nextfile()

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

fileinput.close()

关闭序列。

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

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

等级 FileInput 是实现;它的方法 filename()fileno()lineno()filelineno()isfirstline()isstdin()nextfile()close() 对应于模块中同名的函数。此外,它还有一个 readline() 返回下一个输入行的方法,以及 __getitem__() 实现序列行为的方法。必须严格按照顺序访问序列;随机访问和 readline() 不能混合。

mode 您可以指定将传递到哪个文件模式 open() . 它一定是 'r''rU''U''rb' .

这个 开口钩 如果给定,则必须是接受两个参数的函数, filenamemode ,并返回相应打开的类似对象的文件。不能使用 原地开口钩 一起。

A FileInput 实例可以用作 with 语句。在这个例子中, inputwith 语句已退出,即使发生异常::

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

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

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

3.8 版后已移除: 支持 __getitem__() 方法已弃用。

在 3.8 版更改: 关键字参数 mode开口钩 现在只显示关键字。

Optional in-place filtering: 如果关键字参数 inplace=True 传递给 fileinput.input() 或者到 FileInput 构造器,将文件移动到备份文件,并将标准输出定向到输入文件(如果已存在与备份文件同名的文件,则将静默替换该文件)。这样就可以编写一个过滤器来就地重写其输入文件。如果 备份 给出参数(通常为 backup='.<some extension>' )指定备份文件的扩展名,备份文件保留在周围;默认情况下,扩展名为 '.bak' 当输出文件关闭时会被删除。当读取标准输入时,就地过滤被禁用。

本模块提供以下两个开口钩:

fileinput.hook_compressed(filename, mode)

透明地打开用gzip和bzip2压缩的文件(由扩展名识别 '.gz''.bz2' )使用 gzipbz2 模块。如果文件扩展名不是 '.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 参数。