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

文摘   科技   2024-11-01 08:08   上海  

点击蓝字,关注山海摸鱼人

目录:

  1. fileinput 模块简介
  2. fileinput.input()语法格式
  3. fileinput 模块常用函数
  4. fileinput 注意事项
  5. filename(), lineno(), filelineno()

fileinput模块简介

fileinput模块是一个非常有用的工具,它允许我们像处理单个文件一样处理多个文件。这对于需要对一系列文件进行相同操作的情况非常有用,比如批量修改文件中的某些特定文本,或者统计多个文件中的信息等。

fileinput.input()语法格式

input()函数的完整语法如下:

fileinput.input(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)
  • files (可选): 可以是一个文件名字符串或包含文件名的列表。如果不提供任何文件名,则默认为从标准输入读取。
  • inplace (布尔值): 如果设置为True,则将修改后的内容直接写回原文件。默认为False。
  • backup (字符串): 当inplace为True时,此参数指定原始文件的备份扩展名。如果不指定,则不会创建备份。
  • bufsize (整型): 设置内部缓冲区的大小。默认为0,意味着使用默认的缓冲策略。
  • mode (字符串): 打开文件的模式。默认为'r',即只读模式。
  • openhook (函数): 一个可选的函数,用于控制文件是如何被打开的。通常用来改变文件打开的方式,例如改变编码格式。

fileinput模块常用函数

fileinput.filename(): 返回当前正在读取的文件名。
fileinput.fileno(): 返回当前正在读取文件的文件描述符。
fileinput.lineno(): 返回当前已读取了多少行(全局行号)。
fileinput.filelineno(): 返回当前行在当前文件中的行号。
fileinput.isfirstline(): 判断当前读取的内容在当前文件中是否位于第一行。
fileinput.nextfile(): 关闭当前正在读取的文件,并准备读取下一个文件。
fileinput.close(): 关闭FileInput对象。

fileinput注意事项

当使用fileinput.input()函数时,确保文件名正确无误,否则程序可能会抛出异常。

如果打算使用inplace=True选项来修改文件内容,请小心操作,因为这会永久改变文件内容,如果没有设置backup参数,那么原文件将被覆盖,没有备份。

在使用fileinput模块时,请确保所有相关的文件都已经关闭,否则可能会遇到意外的行为,尤其是在使用inplace选项时。

fileinput模块不能指定打开文件的编码格式,需确保所有文件编码与系统默认编码一致(或者以二进制方式打开文件),否则可能会出现解码错误。

用法示例

首先,让我们创建几个测试文件以便于演示如何使用fileinput模块。假设我们有三个文本文件file1.txt, file2.txt, 和 file3.txt,每个文件里都有一些随机的文本。我们可以先编写一段简单的脚本来生成这些文件:

# 创建测试文件
test_files = ['file1.txt''file2.txt''file3.txt']

for file in test_files:
    with open(file, 'w'as f:
        # 写入一些文本
        f.write(f"这是测试文件{f.name}。\n")
        f.write("我们可以用fileinput模块来读取它们。\n")
        f.write("每个文件都有相似的内容。\n")

让我们现在执行这段代码来创建这些文件。测试文件已经创建好了。接下来,我们将使用fileinput模块来读取这些文件。首先来看一下fileinput.input()的基本用法:

import fileinput

# 使用fileinput模块读取多个文件
for line in fileinput.input(['file1.txt''file2.txt''file3.txt']):
    print(line, end='')  # 注意,这里使用了end=''来防止print函数默认的换行

fileinput.close()

这段代码会依次打印出三个文件的内容。让我们运行这段代码来看看结果。上面的输出展示了三个文件的内容被连续打印了出来。

接下来,我们将使用fileinput模块的一些高级特性来增强我们的脚本。

filename(), lineno(), filelineno()

我们可以利用filename(), lineno(), filelineno()这些函数获取更多的信息,比如当前读取的是哪个文件,当前行号是多少等等。下面的例子展示了如何使用这些函数:

import fileinput

# 使用fileinput模块读取多个文件并获取更多信息
for line in fileinput.input(['file1.txt''file2.txt''file3.txt']):
    print(
        f"文件名: {fileinput.filename()}, 行号: {fileinput.lineno()}, 文件行号: {fileinput.filelineno()}")
    print(line, end='')

fileinput.close()

这段代码会在打印每一行之前显示当前文件的名称以及行号。让我们看一下效果。从上面的输出可以看到,每次读取一行时,都会显示当前文件的名字,总的行号以及在当前文件中的行号。

这样的信息对于调试或者在处理文件时提供额外的上下文很有帮助。

山海摸鱼人
致力于记录美好之瞬间,追寻美好之明天。
 最新文章