Python fileinput模块:逐行读取多个文件

fileinput 模块提供了 input 函数,可以把多个输入流合并在一起,该函数的语法格式如下:

fileinput.input(files="filename1, filename2, ...", inplace=False, backup='', bufsize=0, mode='r', openhook=None)

此函数会返回一个 FileInput 对象,其中,各个参数的含义如下:
  • files:多个文件的路径列表;
  • inplace:用于指定是否将标准输出的结果写回到文件,此参数默认值为 False;
  • backup:用于指定备份文件的扩展名;
  • bufsize:指定缓冲区的大小,默认为 0;
  • mode:打开文件的格式,默认为 r(只读格式);
  • openhook:控制文件的打开方式,例如编码格式等。

当程序使用上面函数创建了 FileInput 对象之后,即可通过 for 循环来遍历文件的每一行。此外,fileinput 还提供了很多全局函数来判断正在读取的文件信息,如表 1 所示。

表 1 fileinput 模块常用函数
函数名 功能描述
fileinput.filename() 返回正在读取的文件的文件名。
fileinput.fileno() 返回当前文件的文件描述符(file descriptor),该文件描述符是一个整数。
fileinput.lineno() 返回当前读取的行号。
fileinput.filelineno() 返回当前读取的行在其文件中的行号。
fileinput.isfirstline() 返回当前读取的行在其文件中是否为第一行。
fileinput.isstdin() 返回最后一行是否从 sys.stdin 读取。程序可以使用“-”代表从 sys.stdin 读取。
fileinput.nextfile() 关闭当前文件,开始读取下一个文件。
fileinput.close() 关闭 FileInput 对象。

文件描述符是一个文件的代号,其值为一个整数。后续章节将会介绍关于文件描述符的操作。

通过上面的介绍不难发现,fileinput 也存在一个缺陷,即在创建 FileInput 对象时不能指定字符集,因此它所读取的文件的字符集必须与操作系统默认的字符集保持一致。当然,如果文本文件的内容是纯英文,则不存在字符集的问题。

假设,目前有 a.txt 和 b.txt 文件,它们位于同一目录,并各自包含如下内容:

#a.txt包含如下内容:
C语言中文网
http://c.biancheng.net

#b.txt包含如下内容:
Python基础教程
http://c.biancheng.net/python

下面程序示范了使用 fileinput 模块来读取以上 2 个文件:
import fileinput
# 一次读取多个文件
for line in fileinput.input(files=('a.txt', 'b.txt')):
    # 输出文件名,当前行在当前文件中的行号
    print(fileinput.filename(), fileinput.filelineno(), line)
# 关闭文件流
fileinput.close()
上面程序使用 fileinput.input 直接合并了 a.txt 和 b.txt 两个文件,这样程序可以直接遍历读取这两个文件的内容。程序运行结果如下:

a.txt 1 C语言中文网

a.txt 2 http://c.biancheng.net
b.txt 1 Python基础教程

b.txt 2 http://c.biancheng.net/python