在 Python 中迭代来自多个输入流的行
Python 的内置 open() 函数以读/写模式打开一个文件并对其进行读/写操作。要批量处理多个文件,必须使用 Python 标准库的 fileinput 模块。此模块提供了一个 Fileinput 类,具有迭代文件的功能。该模块还定义了用于相同目的的辅助函数。
此模块的主要接口是 input() 函数。此函数返回 Fileinput 类的实例。
fileinput.input(files, inplace, mode)
files 参数是要逐个读取的一个或多个文件的名称。每个文件都充当生成器,可以使用 for 循环对其进行迭代。文件中的每一行都将打印在 Python 控制台上。
>>> for line in fileinput.input('data.txt'): print (line)
files 参数可以是由多个文件组成的元组。文件内容将逐一显示。
>>> for line in fileinput.input(files=('a.txt', 'b.txt')): print (line)
Fileinput 类还可以用作 with 语句中的上下文管理器。
>>>使用 fileinput.input(files=('a.txt', 'b.txt')) 作为 f: for line in f: print (line)
fileinput 模块中定义了以下函数。
Sr.No. | 函数 &描述 |
---|---|
1 | filename() 返回当前正在读取的文件的名称。 |
2 | fileno() 返回文件描述符整数。 |
3 | lineno() 返回正在读取的文件的行号。该数字为累计计数。 |
4 | filelineno() 仅返回当前文件的行号。 |
5 | isfirstline() 如果正在读取当前文件的第一行,则返回 true,否则返回 false |
以下语句打印文件中的每一行以及行号
>>> for line in fileinput.input('books.py'): print ('{}->{}'.format(fileinput.filelineno(), line))
上述代码的示例输出为
1->import sqlite3 2->conn = sqlite3.connect('c:/python36/books.db') 3->cursor = conn.cursor() 4->cursor.execute("SELECT * from books;") 5->print(cursor.fetchall())
以下代码打印文件夹中的每个文件名,后跟其中的编号行。在此程序中,使用 glob() 函数返回当前路径中的文件列表(可选,带有匹配的通配符)。此处 glob(‘*.py’) 将返回当前文件夹中所有扩展名为 .py 的文件列表。此列表用作 fileinput.input() 函数的文件参数。
import fileinput, glob, sys for line in fileinput.input(glob.glob("*.py")): if fileinput.isfirstline(): print (fileinput.filename(),'>') sys.stdout.write ("{}.{}".format(fileinput.filelineno(),line))
请注意 isfirstline() 函数的使用。当新文件的迭代开始时,此函数返回 true,并首先打印 fileinput.filename() 函数返回的文件名,然后显示带数字的行。例如
1.py > 1.a = 10 2.b = 20 3.print ('addition=',a+b) hello.py > 1.x = 10 2.y = 20 3.z = x+y 4.print ("x+y=",z)
inplace 参数
默认情况下,fileinput.input() 函数的 inplace = False。如果将其设置为 True,则使输入文件可写。
假设有一个 ‘msg.txt’ 其中包含以下文本。
Hello Python. Good morning
以下代码使用 fileinput 模块打开文件并就地修改其内容。
>>> for line in fileinput.input(files='msg.txt',inplace = True): line = line.replace('morning', 'evening') sys.stdout.write(line)
‘msg.txt’ 将显示已完成的更改。