10.2. fileinput行遍历多个输入流

源程序代码: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错误,则会引发IOError

如果sys.stdin多次使用,第二次和后面的调用将不返回任何行,除非可能存在与用户交互的情况,或者如果它已被显式复位(例如使用sys.stdin。 seek(0)

空文件打开后,会被立即关闭 ;唯一值得注意的就是,文件列表中的最后一个文件是一个空文件。

返回的每一行都保留原有的换行符,这也意味着文件的最后一行,可能没有换行符。

您可以通过openhook参数向fileinput.input()FileInput()提供打开钩子来控制文件的打开方式。钩必须是一个函数,采用两个参数、文件名模式,并返回相应地打开的文件类似对象。本模块已经提供两个有用的挂钩。

下面的函数是本模块的主要接口:

fileinput.input([files[, inplace[, backup[, bufsize[, mode[, openhook]]]]]])

创建FileInput类的一个实例。该实例将用作此模块的函数的全局状态,也会返回在迭代过程中使用。对此函数的参数将传递沿线到FileInput类的构造函数。

2.5 版本中的更改:添加模式openhook参数。

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

fileinput.filename()

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

fileinput.fileno()

返回整数为当前文件的"文件描述符"。当没有文件打开时 (第一行之前和文件之间),则返回-1

新版本 2.5 中的。

fileinput.lineno()

返回只是读取的行的累积的行号。在读第一行之前,则返回0已读取的最后一行的最后一个文件后,返回的行的行号。

fileinput.filelineno()

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

fileinput.isfirstline()

返回 true 如果只读取的行是其文件的第一行 ; 否则返回假。

fileinput.isstdin()

返回 true 如果从sys.stdin,读取的最后一行 ; 否则返回 false。

fileinput.nextfile()

关闭当前文件,以便下一次迭代将读取第一行从下一个文件 (如果有) ;无法从该文件读取的行不会计算在累积的行计数。文件名不变直到之后的下一个文件的第一行已被读取。在读第一行之前,此函数具有任何效力 ;它不能用于跳过的第一个文件。已读取的最后一行的最后一个文件后,此功能没有任何影响。

fileinput.close()

关闭序列。

实现序列行为模块所提供的类是供以及子类:

class fileinput.FileInput([files[, inplace[, backup[, bufsize[, mode[, openhook]]]]]])

FileInput是执行情况 ;其方法filename() fileno() lineno() filelineno() isfirstline() isstdin() nextfile()close ()对应于相同的名称,在模块中的功能。另外,它有readline ()方法返回下一个输入的行和__getitem__()方法,实现了序列的行为。必须严格按顺序 ; 访问序列随机存取和readline ()不能混合。

模式您可以指定哪些文件模式将被传递到open ()它必须是一个'r' '儒' 'U''理'

Openhook,当给出,必须是一个函数,采用两个参数、文件名模式,并返回相应地打开的文件类似对象。您不能使用就地openhook在一起。

2.5 版本中的更改:添加模式openhook参数。

可选就地筛选:如果关键字参数就地 = 1传递到fileinput.input()FileInput构造函数,则将该文件移动到一个备份文件和标准的输出被定向到的输入文件 (如果文件备份文件相同的名称已经存在,它将取代默默地)。这样一来,我们就可以编写一个筛选器,用于重写它在地方的输入的文件。如果给出了备份参数 (通常是作为备份 ='。 < 一些扩展 >'),它指定备份文件的扩展名和备份文件仍然是左右 ;默认情况下,电话分机是'.bak'并关闭输出文件时,它删除。标准输入中读取时,禁用就地过滤。

当前实现并不适用于 MS-DOS 8 + 3 的文件系统。

此模块提供两个以下的开放挂接:

fileinput.hook_compressed(filename, mode)

透明地打开用 gzip 压缩的文件和 bzip2 (通过扩展'.gz''.bz2'公认) 使用gzipbz2模块。如果文件扩展名不是'.gz''.bz2',通常打开文件 (即,使用open ()没有任何减压)。

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

新版本 2.5 中的。

fileinput.hook_encoded(encoding)

返回一个钩子,打开每个文件将与codecs.open(),使用给定的编码来读取该文件。

Usage example: fi = fileinput.FileInput(openhook=fileinput.hook_encoded("iso-8859-1"))

与此挂接FileInput可能会返回 Unicode 字符串,具体取决于指定的编码

新版本 2.5 中的。