代码资源: Lib/fileinput.py
该模块包含一个帮助类,以及可用于在标准输入、列表及文件中快速循环写入的函数。如果你仅仅只是想要读取或写入一个文件,请参照open()函数。
典型的使用如下:
import fileinput
for line in fileinput.input():
process(line)
这会遍历sys.argv[1:]中列出的文件的所有行,如果该列表为空,默认值为sys.stdin。如果一个文件名为’-’,它也将会被sys.stdin替换。如要指定另一个文件名列表,那么就将它作为input()的第一个参数传入。一个单独的文件名也被允许。
所有的文件都默认以文本模式打开,但是你可以通过指定被调用的input()或FileInput函数的模式参数来改变打开方法。如果打开文件或阅读文件中发生了I/O错误,将会抛出OSError。
如果sys.stdin被多次使用,第二次及以后的使用都不会反回行,除非它用于交互用途或者已经明确被复位(即:使用sys.stdin.seek(0))。
空文件被打开后将被立刻关闭;它们出现在文件名列表中的唯一时间是最新的文件被打开时确认为空。
行总会被返回无损的新航,这意味着文件的最后一行可能没有值。
你可以控制文件如何被打开,该方法通过提供一个开放钩经由openhook参数传递给fileinput.input()或FileInput()。这个勾必须是一个由两个参数的函数,包括filename和mode,并且返回一个相应打开的类文件对象。两个常用的钩早已由该模块提供。
下列的函数为该模块的主要接口:
fileinput. input(files=None, inplace=False, backup=’’, bufsize=0, mode=’r’, openhook=None)
创建一个FileInput类的实例。该实例被作为该模块函数的全局状态,并且它会在迭代过程中被返回后使用。该函数的参数将被传送给FileInput类的构造器。
FileInput实例可以被在with状态内作为上下文管理器使用。在下例中,with状态存在后input将会被关闭,甚至例外发生也会导致:
with fileinput.input(files=('spam.txt', 'eggs.txt')) as f:
for line in f:
process(line)
下列函数使用由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()不能混合使用。
mode可以使你通过将其传递给open()实现指定文件模式。它必须是’r’、’rU’、’U’和’rb’中的一个。
当给定openhook时,函数必须已被给定两个参数:filename和mode,并且将返回相应的打开的类文件对象。你不能同时使用inplace和openhook。
FileInput实例可以被使用在with状态的上下文管理器中。在该示例中,with状态存在后。甚至发生例外时,input将被关闭。
with FileInput(files=('spam.txt', 'eggs.txt')) as input:
process(input)
可选就地过滤:如果关键字参数inplace_True被传递给fileinput.input()或FileInput构造器,该文件被移动到备份文件内,并且标准输出指向输入文件(如果一个文件的同名备份文件已经存在,已存在的将被静默取代)。这就使得写一个过滤器使得输入文件本地重写成为可能。如果backup参数被给定(典型的是backup=’.
下列的两个开放钩由该模块提供:
fileinput. hook_compressed(filename, mode)
透明的打开gzip和bzip2(通过扩展名’. gz’和’. bz2’识别)格式的压缩文件,通过使用gzip和bz2模块。如果文件名扩展不是’. gz’和’. bz2’,文件将被正常打开(即,使用open()不带有任何解压)。
使用示例:fi = fileinput.FileInput(openhook=fileinput.hook_compressed)
fileinput. hook_encoded(encoding, errors=None)
使用open()打开每一个文件,使用给定的encoding和errors去读取文件,返回一个hook。
使用示例:fi = fileinput.FileInput(openhook=fileinput.hook_encoded("utf-8", "surrogateescape"))