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()
FileInput
OSError
在版本3.3中更改:IOError
曾经被提升; 它现在是别名OSError
。
如果sys.stdin
多次使用,则第二次和进一步使用将不返回任何行,除非可能用于交互式使用,或者已经明确重置(例如使用sys.stdin.seek(0)
)。
打开空文件并立即关闭; 唯一一次,他们在文件名列表中的存在是显而易见的,即最后打开的文件是空的。
返回的行与任何换行完整,这意味着文件中的最后一行可能没有。
您可以通过openfileinput.input()
或hook参数提供一个打开挂钩来控制文件的打开方式 FileInput()
。钩子必须是一个带有两个参数的函数,文件名和模式,并返回一个相应打开的类文件对象。该模块已经提供了两个有用的钩子。
以下函数是此模块的主要接口:
fileinput.
input
(files = None,inplace = False,backup =”,bufsize = 0,mode =’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.
FileInput
(files = None,inplace = False,backup =”,bufsize = 0,mode =’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'
使用)gzip
和bz2
模块。如果文件扩展名不是'.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参数。