fileinput — 遍历来自多个输入流的行

源代码: Lib/fileinput.py


此模块实现的帮手类和函数,能快速编写基于标准输入 (或文件列表) 的循环。若仅仅想要读写一个文件,见 open() .

典型用法:

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

这遍历所有文件的行,文件列出于 sys.argv[1:] ,默认为 sys.stdin 若列表为空。若文件名为 '-' ,它也被替换为 sys.stdin 和可选自变量 mode and openhook 被忽略。要指定文件名的替代列表,将它作为第一自变量传递给 input() 。单文件名也是允许的。

默认情况下,所有文件按文本模式打开,但可以覆盖这通过指定 mode 参数在调用 input() or FileInput 。若在打开 (或读取) 文件期间出现 I/O 错误, OSError 被引发。

3.3 版改变: IOError 曾被引发;它现在是别名化的 OSError .

sys.stdin 被多次使用,第二次和进一步使用将不返回行 (除或许为交互使用外),或者若它被明确重置 (如使用 sys.stdin.seek(0) ).

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

行与任何完整换行符一起返回,意味着文件中的最后行可能没有换行符。

可以控制如何打开文件通过提供打开挂钩凭借 openhook 参数用于 fileinput.input() or FileInput() 。挂钩必须是接受 2 自变量的函数, filename and mode ,并返回故此打开的像文件对象。此模块已提供 2 个有用挂钩。

以下函数是此模块的首要接口:

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

创建实例化的 FileInput 类。实例将用作此模块函数的全局状态,且还返回以用于迭代期间。将传递此函数的参数沿构造函数对于 FileInput 类。

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

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

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

3.8 版改变: 关键词参数 mode and openhook 现在是仅关键词。

以下函数使用的全局状态创建通过 fileinput.input() ;若没有活动状态, RuntimeError 被引发。

fileinput. filename ( )

Return the name of the file currently being read. Before the first line has been read, returns None .

fileinput. fileno ( )

Return the integer “file descriptor” for the current file. When no file is opened (before the first line and between files), returns -1 .

fileinput. lineno ( )

Return the cumulative line number of the line that has just been read. Before the first line has been read, returns 0 . After the last line of the last file has been read, returns the line number of that line.

fileinput. filelineno ( )

Return the line number in the current file. Before the first line has been read, returns 0 . After the last line of the last file has been read, returns the line number of that line within the file.

fileinput. isfirstline ( )

返回 True if the line just read is the first line of its file, otherwise return False .

fileinput. isstdin ( )

返回 True 若最后行读取自 sys.stdin ,否则返回 False .

fileinput. nextfile ( )

Close the current file so that the next iteration will read the first line from the next file (if any); lines not read from the file will not count towards the cumulative line count. The filename is not changed until after the first line of the next file has been read. Before the first line has been read, this function has no effect; it cannot be used to skip the first file. After the last line of the last file has been read, this function has no effect.

fileinput. close ( )

关闭序列。

The class which implements the sequence behavior provided by the module is available for subclassing as well:

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

FileInput 是实现;其方法 filename() , fileno() , lineno() , filelineno() , isfirstline() , isstdin() , nextfile() and close() correspond to the functions of the same name in the module. In addition it has a readline() method which returns the next input line, and a __getitem__() method which implements the sequence behavior. The sequence must be accessed in strictly sequential order; random access and readline() cannot be mixed.

采用 mode you can specify which file mode will be passed to open() 。它必须是某一 'r' , 'rU' , 'U' and 'rb' .

The openhook , when given, must be a function that takes two arguments, filename and mode , and returns an accordingly opened file-like object. You cannot use inplace and openhook 在一起。

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

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

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

从 3.4 版起弃用: The 'rU' and 'U' 模式。

从 3.8 版起弃用: 支持 __getitem__() 方法被弃用。

3.8 版改变: 关键词参数 mode and openhook 现在是仅关键词。

可选原位过滤: 若关键词自变量 inplace=True 被传递给 fileinput.input() or to the FileInput constructor, the file is moved to a backup file and standard output is directed to the input file (if a file of the same name as the backup file already exists, it will be replaced silently). This makes it possible to write a filter that rewrites its input file in place. If the backup parameter is given (typically as backup='.<some extension>' ), it specifies the extension for the backup file, and the backup file remains around; by default, the extension is '.bak' and it is deleted when the output file is closed. In-place filtering is disabled when standard input is read.

此模块提供以下 2 打开挂钩:

fileinput. hook_compressed ( filename , mode )

Transparently opens files compressed with gzip and bzip2 (recognized by the extensions '.gz' and '.bz2' ) 使用 gzip and bz2 modules. If the filename extension is not '.gz' or '.bz2' , the file is opened normally (ie, using open() without any decompression).

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

fileinput. hook_encoded ( encoding , errors=None )

返回的挂钩打开每个文件采用 open() ,使用给定 encoding and errors 以读取文件。

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

3.6 版改变: 添加可选 errors 参数。

上一话题

os.path — 常见路径名操纵

下一话题

stat — 解释 stat() 结果

本页