You are here:  Home » Python » fileinput迭代多个输入流中的行详解(3)Python文件和目录访问模块(必读进阶Python教程)(参考资料)

该模块实现了一个辅助类和函数,可以通过标准输入或文件列表快速编写循环。如果您只是想读或写一个文件,请参阅open()

典型用途是:

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

 

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

默认情况下,所有文件都以文本模式打开,但您可以通过在调用或中 指定mode参数来覆盖它。如果在打开或读取文件期间发生I / O错误, 则引发此错误。input()FileInputOSError

在版本3.3中更改:IOError曾经被提升; 它现在是别名OSError

如果sys.stdin多次使用,则第二次和进一步使用将不返回任何行,除非可能用于交互式使用,或者已经明确重置(例如使用sys.stdin.seek(0))。

打开空文件并立即关闭; 唯一一次,他们在文件名列表中的存在是显而易见的,即最后打开的文件是空的。

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

您可以通过openfileinput.input()hook参数提供一个打开挂钩来控制文件的打开方式 FileInput()。钩子必须是一个带有两个参数的函数,文件名模式,并返回一个相应打开的类文件对象。该模块已经提供了两个有用的钩子。

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

fileinput.inputfiles = Noneinplace = Falsebackup =”bufsize = 0mode =’r’openhook = None 
创建FileInput类的实例。该实例将用作此模块的函数的全局状态,并且还将在迭代期间返回使用。此函数的参数将传递给FileInput类的构造函数。

FileInput实例可以在with语句中用作上下文管理器 。在此示例中,即使发生异常,也会在退出语句后关闭输入with

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

 

版本3.2中已更改:可用作上下文管理器。

:自3.6版本弃用,将在3.8版本中移除BUFSIZE参数。

以下函数使用由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.FileInputfiles = Noneinplace = Falsebackup =”bufsize = 0mode =’r’openhook = None 
FileInput是实现; 它的方法filename(), fileno()lineno()filelineno()isfirstline()isstdin()nextfile()close()对应于所述模块中的相同名称的功能。另外,它有一个 readline()返回下一个输入行的__getitem__()方法,以及一个实现序列行为的方法。必须严格按顺序访问序列; 随机访问,readline()不能混合。

使用模式,您可以指定要传递给哪种文件模式open()。它必须是一个'r''rU''U''rb'

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

一个FileInput实例可以被用作上下文管理 with语句。在此示例中,即使发生异常,也会在退出语句后关闭 输入with

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

 

版本3.2中已更改:可用作上下文管理器。

自从3.4版本不推荐使用:'rU''U'模式。

:自3.6版本弃用,将在3.8版本中移除BUFSIZE参数。

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

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

fileinput.hook_compressed文件名模式
透明打开用gzip和bzip2(通过扩展公认的压缩文件'.gz',并'.bz2'使用)gzipbz2 模块。如果文件扩展名不是'.gz''.bz2',则文件正常打开(即,使用时open()不进行任何解压缩)。

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

fileinput.hook_encoded编码错误=无
返回一个挂钩open(),使用给定的 编码错误来打开每个文件以读取文件。

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

版本3.6中已更改:添加了可选的errors参数。