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

Python的fileinput模块提供了一种方便的方式读取多个文件,通过fileinput.input()函数可以依次读取指定文件列表的内容。在不指定编码的情况下,所有文件必须与系统默认编码匹配。fileinput还提供了如filename()、fileno()、lineno()等实用函数,帮助跟踪文件处理状态。在给定示例中,程序展示了如何读取并打印两个文件的内容,按照文件列表的顺序逐行输出。
摘要由CSDN通过智能技术生成

前面章节中,我们学会了使用 open() 和 read()(或者 readline()、readlines() )组合,来读取单个文件中的数据。但在某些场景中,可能需要读取多个文件的数据,这种情况下,再使用这个组合,显然就不合适了。

庆幸的是,Python提供了 fileinput 模块,通过该模块中的 input() 函数,我们能同时打开指定的多个文件,还可以逐个读取这些文件中的内容。

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:控制文件的打开方式,例如编码格式等。

注意,和 open() 函数不同,input() 函数不能指定打开文件的编码格式,这意味着使用该函数读取的所有文件,除非以二进制方式进行读取,否则该文件编码格式都必须和当前操作系统默认的编码格式相同,不然 Python 解释器可能会提示 UnicodeDecodeError 错误。

和 open() 函数返回单个的文件对象不同,fileinput 对象无需调用类似 read()、readline()、readlines() 这样的函数,直接通过 for 循环即可按次序读取多个文件中的数据。

值得一提的是,fileinput 模块还提供了很多使用的函数(如表 1 所示),通过调用这些函数,可以帮我们更快地实现想要的功能。

函数名功能描述
fileinput.filename()返回当前正在读取的文件名称。
fileinput.fileno()返回当前正在读取文件的文件描述符。
fileinput.lineno()返回当前读取了多少行。
fileinput.filelineno()返回当前正在读取的内容位于当前文件中的行号。
fileinput.isfirstline()判断当前读取的内容在当前文件中是否位于第 1 行。
fileinput.nextfile()关闭当前正在读取的文件,并开始读取下一个文件。
fileinput.close()关闭 FileInput 对象。

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

讲了这么多,接下来举个例子。假设使用 input() 读取 2 个文件,分别为 my_file.txt 和 file.txt,它们位于同一目录,且各自包含的内容如下所示:

#file.txt
Python教程
http://www.baidu.com

#my_file.txt
Linux教程
http://www.crome.com

下面程序演示了如何使用 input() 函数依次读取这 2 个文件:

import fileinput

#使用for循环遍历 fileinput 对象
for line in fileinput.input(files=('my_file.txt', 'file.txt')): 
  # 输出读取到的内容    
  print(line)
  
# 关闭文件流
fileinput.close()

在使用 fileinput 模块中的 input() 函数之前,一定要先引入 fileinput 模块。

程序执行结果为:

Linux教程

http://www.crome.com
Python教程

http://www.baidu.com

显然,读取文件内容的次序,取决于 input() 函数中文件名的先后次序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿与你共信仰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值