Python模块和包
12 Python文件操作(I/O)
12.1 什么是文件路径,Python中如何书写文件路径?
12.2 Python绝对路径和相对路径
12.3 Python文件基本操作
12.4 Python open
12.5 以文本格式和二进制格式打开文件,到底有什么区别?
12.6 Python read
12.7 Python readline()和readlines()
12.8 Python write和writelines
12.9 Python close
12.10 Python seek和tell
12.11 Python with as
12.12 什么是上下文管理器,深入底层了解Python with as语句
12.13 Python pickle模块
12.14 Python fileinput模块:逐行读取多个文件
12.15 Python linecache模块用法:随机读取文件指定行
12.16 Python pathlib模块
12.17 Python os.path模块
12.18 Python fnmatch模块
12.19 Python使用os模块操作文件和目录
12.20 Python tempfile模块:生成临时文件和临时目录
前面章节中,我们学会了使用 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 所示),通过调用这些函数,可以帮我们更快地实现想要的功能。
表 1 fileinput 模块常用函数 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://c.biancheng.net/python/
#my_file.txt
Linux教程
http://c.biancheng.net/linux_tutorial/

下面程序演示了如何使用 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://c.biancheng.net/linux_tutorial/
Python教程
http://c.biancheng.net/python/

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

关注公众号「 站长严长生 」,在手机上阅读所有教程,随时随地都能学习。本公众号由 C语言中文网站长 亲自运营,长期更新,坚持原创。

微信扫码关注公众号
  • SELinux安全上下文的修改和设置(chcon和restorecon命令)
  • C++求数组中的最大值和最小值(带源码)
  • Python __slots__:限制类实例动态添加属性和方法
  • Go语言error接口:返回错误信息
  • 网络数据传输时的大小端问题
  • DNS报文格式解析(非常详细)
  • C++ STL vector插入元素(insert()和emplace())详解
  • PLC是什么(超级详细)
  •