目录:
fileinput
模块简介fileinput.input()
语法格式fileinput
模块常用函数fileinput
注意事项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()
这段代码会在打印每一行之前显示当前文件的名称以及行号。让我们看一下效果。从上面的输出可以看到,每次读取一行时,都会显示当前文件的名字,总的行号以及在当前文件中的行号。
这样的信息对于调试或者在处理文件时提供额外的上下文很有帮助。