Python fileinput模块

1,126 阅读3分钟

玩转Python

这是我参与8月更文挑战的第5天,活动详情查看: 8月更文挑战

回顾复习

我们前面在文件读写操作学会了使用 open() 和 read()( readline()、readlines())组合,来读取单个文件中的数据。

但在需要读取多个文件的数据,这种情况下,再使用这个组合,显然就不合适了

关于读写文件操作可以分为单文件和多文件操作如下:

常见文件操作

因此,我们本次来学习,fileinput模块对多文件进行读取进行操作

1. fileinput模式概述

Python提供fileinput模块对一个或者多个文件中的内容进行迭代、遍历、格式化输出、查找替换操作功能

  • 打开文件:fileinput模块提供input函数支持打开单个或多个文件;当传入多个文件参数方式files=('file1','file2')
  • 读取文件:可以通过for循环进行读取
  • 打开读取文件方式:默认以文本模式进行操作
  • 读取多个文件时遇到空文件时:则打开后将立即关闭
  • 可以控制打开文件的方式两种方法:fileinput.input()和FileInput()
  • 可以与上下文管理器with进行组合使用

注意:

  1. 如果fileinput模块操作文件时方式I/O错误,系统将会抛出OSError(Python 3.3版本更名)
  2. 同样我们在使用fileinput模块对文件操作完后,也要关闭文件(fileinput.close()),否则会一直占用系统资源消耗CPU,长时间下去会发生OOM内存溢出等异常问题

推荐方法:

fileinput模块读取文件内容,使用for循环来进行读取,格式如下:

import fileinput
for line in fileinput.input():
    process(line)

根据,前面学习的readlines(),对比fileinpput.input()有啥异同点:

  • 相同点:fileinput.input()工作方式与readlines类似
  • 区别点:fileinput.input()是创建一个xreadlines对象存储每一行数据 readlines()则是将内容全部读取放到列表中

2. fileinput模块方法

fileinput模块提供来可以支持读取多文件操作,常见方法如下:

方法作用
fileinput.input(file)返回能够用于for循环遍历的对象(每行数据)
fileinput.filename()返回当前文件的名称
fileinput.lineno()返回当前已经读取的行的数量(序号)
fileinput.filelineno()返回当前读取的行的行号
fileinput.isfirstline()检查当前行是否文件的第一行
fileinput.isstdin()判断最后一行是否从stdin中读取
fileinput.close()关闭队列
import fileinput
 
def fileread(file):

    for line in fileinput.input(file):

        print (fileinput.filename(),'>>','Line Number:',fileinput.lineno(),'>>',line)

#调用读取两个文件内容
fileread(("test.txt","test1.txt"))

fileinput运行结果

3. 读取文件方法汇总

汇总一下,Python有7个方法,如下:

读取文件操作方法

✶✶管道输入(了解):

Python中提供了sys.stdin类文件对象来读取键盘对象输入。但是在某些时候希望读取的不是来自用户的,而是来自某个命令,此时就需要管道输入。 管道输入作用在于,将前一个命令的输出,当成下一个命令的输入。支持多平台

✶随机读取指定行:

linecache模块允许Python源文件中随机读取指定行,并在内部使用缓冲优化存储。由于该模块主要设计成读取Python源文件,因此它会用UTF-8字符集来读取文本文件。

import linecache
import random

print(linecache.getline(random.__file__,3))
print(linecache.getline('linecache.py',3))
print(linecache.getline('test.txt',2))

随机指定文件行数内容运行结果

✍总结

本期,我们又学习关于文件操作的模块fileinput,当我们需要对多个文件进行打开读取时,我们就可以使用fileinput.input()方法与for循环结合来实现,大家在日常使用时,按需要进行使用

以上是本期内容,欢迎大佬们点赞评论指正,下次见~💋💋