fileinput
— 迭代多个输入流中的行¶
源代码: Lib/fileinput.py
这个模块实现了一个帮助类和一些函数,可以快速编写一个循环来处理标准输入或文件列表。如果只想读取或写入一个文件,请参阅 open()
。
典型的用法是
import fileinput
for line in fileinput.input(encoding="utf-8"):
process(line)
这将迭代 sys.argv[1:]
中列出的所有文件的行,如果列表为空,则默认为 sys.stdin
。如果文件名是 '-'
,它也会被 sys.stdin
替换,并且可选参数 *mode* 和 *openhook* 将被忽略。要指定一个备选的文件名列表,将其作为第一个参数传递给 input()
。也允许使用单个文件名。
默认情况下,所有文件都以文本模式打开,但是你可以通过在调用 input()
或 FileInput
时指定 *mode* 参数来覆盖此设置。如果在打开或读取文件时发生 I/O 错误,则会引发 OSError
。
如果多次使用 sys.stdin
,则第二次及以后的使用将不返回任何行,除非用于交互式使用,或者如果它已被显式重置(例如,使用 sys.stdin.seek(0)
)。
空文件将被打开并立即关闭;它们在文件名列表中存在的唯一可见时间是当最后一个打开的文件为空时。
返回的行将保留所有换行符,这意味着文件中的最后一行可能没有换行符。
你可以通过通过 *openhook* 参数向 fileinput.input()
或 FileInput()
提供一个打开钩子来控制文件的打开方式。该钩子必须是一个接受两个参数的函数:*filename* 和 *mode*,并返回一个相应打开的类文件对象。如果指定了 *encoding* 和/或 *errors*,它们将作为额外的关键字参数传递给该钩子。此模块提供了一个 hook_compressed()
来支持压缩文件。
以下函数是此模块的主要接口
- fileinput.input(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)¶
创建
FileInput
类的实例。该实例将用作此模块的函数的全局状态,并且也会在迭代期间返回以供使用。此函数的参数将传递给FileInput
类的构造函数。FileInput
实例可以在with
语句中用作上下文管理器。在此示例中,即使发生异常,input 也会在退出with
语句后关闭with fileinput.input(files=('spam.txt', 'eggs.txt'), encoding="utf-8") as f: for line in f: process(line)
在 3.2 版本中更改: 可以用作上下文管理器。
在 3.8 版本中更改: 关键字参数 *mode* 和 *openhook* 现在是仅限关键字的。
在 3.10 版本中更改: 添加了仅限关键字的参数 *encoding* 和 *errors*。
以下函数使用由 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='', *, mode='r', openhook=None, encoding=None, errors=None)¶
类
FileInput
是具体的实现;其方法filename()
,fileno()
,lineno()
,filelineno()
,isfirstline()
,isstdin()
,nextfile()
和close()
对应于模块中同名的函数。此外,它是 可迭代的,并且有一个readline()
方法,该方法返回下一行输入。 序列必须按严格的顺序访问;不能混合随机访问和readline()
。使用 mode,你可以指定将传递给
open()
的文件模式。它必须是'r'
和'rb'
之一。openhook(如果给定)必须是一个接受两个参数 filename 和 mode 的函数,并返回一个相应打开的类文件对象。你不能同时使用 inplace 和 openhook。
你可以指定传递给
open()
或 openhook 的 encoding 和 errors。FileInput
实例可以在with
语句中用作上下文管理器。在这个例子中,即使发生异常,在退出with
语句后,input 也会被关闭。with FileInput(files=('spam.txt', 'eggs.txt')) as input: process(input)
在 3.2 版本中更改: 可以用作上下文管理器。
在 3.8 版本中更改: 关键字参数 mode 和 openhook 现在是仅限关键字的。
在 3.10 版本中更改: 添加了仅限关键字的参数 *encoding* 和 *errors*。
在 3.11 版本中更改:
'rU'
和'U'
模式以及__getitem__()
方法已被移除。
可选的就地过滤:如果将关键字参数 inplace=True
传递给 fileinput.input()
或 FileInput
构造函数,则该文件将被移动到备份文件,并且标准输出将被定向到输入文件(如果已存在与备份文件同名的文件,它将被静默替换)。这使得可以编写一个过滤器,在适当的位置重写其输入文件。如果给出了 backup 参数(通常为 backup='.<some extension>'
),则它指定备份文件的扩展名,并且备份文件保留;默认情况下,扩展名为 '.bak'
,并且在关闭输出文件时将其删除。当读取标准输入时,禁用就地过滤。
本模块提供了以下两个打开钩子
- fileinput.hook_compressed(filename, mode, *, encoding=None, errors=None)¶
使用
gzip
和bz2
模块透明地打开使用 gzip 和 bzip2 压缩的文件(通过扩展名'.gz'
和'.bz2'
识别)。如果文件名扩展名不是'.gz'
或'.bz2'
,则该文件将正常打开(即,使用open()
而不进行任何解压缩)。encoding 和 errors 值被传递给压缩文件的
io.TextIOWrapper
和普通文件的 open。用法示例:
fi = fileinput.FileInput(openhook=fileinput.hook_compressed, encoding="utf-8")
在 3.10 版本中更改: 添加了仅限关键字的参数 *encoding* 和 *errors*。
- fileinput.hook_encoded(encoding, errors=None)¶
返回一个钩子,该钩子使用给定的 encoding 和 errors 使用
open()
打开每个文件以读取文件。用法示例:
fi = fileinput.FileInput(openhook=fileinput.hook_encoded("utf-8", "surrogateescape"))
在 3.6 版本中更改: 添加了可选的 errors 参数。
自 3.10 版本起已弃用: 此函数已被弃用,因为
fileinput.input()
和FileInput
现在具有 encoding 和 errors 参数。