On this page
10.2. fileinput —迭代来自多个 Importing 流的行
源代码: Lib/fileinput.py
该模块实现了一个帮助器类,并具有在标准 Importing 或文件列表上快速编写循环的Function。如果您只想读取或写入一个文件,请参见open()。
典型的用法是:
import fileinput
for line in fileinput.input():
process(line)
这会在sys.argv[1:]
中列出的所有文件的行上进行迭代,如果列表为空,则默认为sys.stdin
。如果文件名是'-'
,它也将替换为sys.stdin
。要指定文件名的替代列表,请将其作为第一个参数传递给input()。也允许使用单个文件名。
默认情况下,所有文件都以文本模式打开,但是您可以pass在对input()或FileInput()的调用中指定* mode *参数来覆盖此文件。如果在打开或读取文件期间发生 I/O 错误,则会引发IOError。
如果sys.stdin
被多次使用,则第二次及以后的使用将不返回任何行,除非是交互式使用,或者已被明确重置(例如,使用sys.stdin.seek(0)
)。
空文件被打开并立即关闭;只有在最后一个打开的文件为空时,它们在文件名列表中的存在才是显而易见的。
返回的行将完整保留所有换行符,这意味着文件中的最后一行可能没有一行。
您可以passfileinput.input()或FileInput()的* openhook 参数提供一个打开钩子来控制文件的打开方式。该钩子必须是一个带有两个参数 filename 和 mode *的函数,并返回相应打开的类似文件的对象。该模块已经提供了两个有用的钩子。
以下Function是此模块的主要接口:
fileinput.
input
([[* files * [,* inplace * [,* backup * [,* bufsize * [,* mode * [,* openhook *]]]]]]))
在版本 2.5 中更改:添加了* mode 和 openhook *参数。
在版本 2.7.12 中更改:不再使用* bufsize *参数。
以下函数使用fileinput.input()创建的全局状态;如果没有活动状态,则引发RuntimeError。
fileinput.
filename
( )- 返回当前正在读取的文件的名称。在读取第一行之前,返回
None
。
- 返回当前正在读取的文件的名称。在读取第一行之前,返回
fileinput.
fileno
( )- 返回当前文件的整数“文件 Descriptors”。如果没有打开文件(在第一行之前和文件之间),则返回
-1
。
- 返回当前文件的整数“文件 Descriptors”。如果没有打开文件(在第一行之前和文件之间),则返回
2.5 版的新Function。
fileinput.
lineno
( )- 返回刚刚读取的行的累积行号。在读取第一行之前,返回
0
。读取最后一个文件的最后一行后,返回该行的行号。
- 返回刚刚读取的行的累积行号。在读取第一行之前,返回
fileinput.
filelineno
( )- 返回当前文件中的行号。在读取第一行之前,返回
0
。读取最后一个文件的最后一行后,返回文件中该行的行号。
- 返回当前文件中的行号。在读取第一行之前,返回
fileinput.
isfirstline
( )- 如果刚读取的行是文件的第一行,则返回 true;否则返回 false。
fileinput.
isstdin
( )- 如果从
sys.stdin
读取了最后一行,则返回 true,否则返回 false。
- 如果从
fileinput.
nextfile
( )- 关闭当前文件,以便下一次迭代将从下一个文件(如果有)中读取第一行;未从文件中读取的行将不会计入累积行数。在读取下一个文件的第一行之前,文件名不会更改。在读取第一行之前,此Function无效。它不能用于跳过第一个文件。读取最后一个文件的最后一行后,此Function无效。
fileinput.
close
( )- 关闭序列。
实现模块提供的序列行为的类也可用于子类化:
-
- class *
fileinput.
FileInput
([* files * [,* inplace * [,* backup * [,* bufsize * [,* mode * [,* openhook *]]]]]]]]]])
- FileInput类是实现;其方法filename(),fileno(),lineno(),filelineno(),isfirstline(),isstdin(),nextfile()和close()对应于模块中相同名称的Function。此外,它还有一个readline()方法返回下一个 Importing 行,还有一个getitem()方法实现序列行为。必须严格按 Sequences 访问该序列。随机访问和readline()不能混合使用。
- class *
使用* mode *,您可以指定将哪种文件模式传递给open()。它必须是'r'
,'rU'
,'U'
和'rb'
之一。
如果给定了* openhook ,它必须是一个带有两个参数 filename 和 mode 的函数,并返回相应打开的类似文件的对象。您不能同时使用 inplace 和 openhook *。
在版本 2.5 中更改:添加了* mode 和 openhook *参数。
在版本 2.7.12 中更改:不再使用* bufsize *参数。
可选的就地过滤: 如果将关键字参数inplace=1
传递给fileinput.input()或FileInput构造函数,则该文件将移至备份文件,并且标准输出将定向到 Importing 文件(如果文件名称相同)因为备份文件已经存在,它将被静默替换)。这样就可以编写一个过滤器,该过滤器可以在原处重写其 Importing 文件。如果给定了* backup *参数(通常为backup='.<some extension>'
),则它指定备份文件的 extensions,并且备份文件仍然存在。默认情况下,extensions 是'.bak'
,并且在关闭输出文件时将其删除。读取标准 Importing 时,将禁用就地过滤。
Note
当前的实现不适用于 MS-DOS 8 3 文件系统。
该模块提供以下两个打开钩:
fileinput.
hook_compressed
(* filename , mode *)
用法示例:fi = fileinput.FileInput(openhook=fileinput.hook_compressed)
2.5 版的新Function。
fileinput.
hook_encoded
(编码)- 返回一个钩子,该钩子使用io.open()打开每个文件,并使用给定的* encoding *读取该文件。
用法示例:fi = fileinput.FileInput(openhook=fileinput.hook_encoded("iso-8859-1"))
Note
使用此钩子,FileInput可能会根据指定的* encoding *返回 Unicode 字符串。
2.5 版的新Function。