简介
fileinput是python的标准库,是对open的一个高级封装。可以对一个或者多个文件中的内容进行迭代、遍历等操作;还可以对文档进行格式化输出、查找、替换部分内容等操作。
说明参考官方文档
接口形式
fileinput模块有两种接口使用方式:
- 函数
fileinput.input(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)
- 类
class fileinput.FileInput(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)
常用的接口,函数、类都有这些对应接口,使用起来比较类似
接口 | 说明 |
---|---|
filename() |
获取当前文件名称,因为同时可以处理多个文件,所以此函数用处还是比较大 |
fileno() |
返回以整数表示的当前文件“文件描述符” |
lineno() |
返回已被读取的累计行号 |
filelineno() |
返回当前文件中的行号 |
isfirstline() |
如果刚读取的行是其所在文件的第一行则返回 True,否则返回 False |
isstdin() |
如果最后读取的行来自 sys.stdin 则返回 True,否则返回 False |
nextfile() |
关闭当前文件以使下次迭代将从下一个文件(如果存在)读取第一行;不是从该文件读取的行将不会被计入累计行数。 |
close() |
关闭序列。 |
实例
类、函数形式使用方法类似,这里以函数形式为例说明
读取文件
import fileinput
def readFiles(files):
with fileinput.input(files=files, mode='r', openhook=fileinput.hook_encoded('utf-8',)) as input:
for idx, line in enumerate(input):
if input.isfirstline():
print(f"reading file {input.filename()}...")
else:
print(line, end='')
说明:
- files是可以是单个文件名,也可以是多个文件名的集合,如下:
files = ('test.h', 'prod.ini')
readFiles(files)
readFiles('test.h')
-
fileinput
模块在python3
上好像没有encoding
字段了,如果想指定encoding
需要使用上面例子中的方式,即钩子函数hook_encoded
中指定
修改文件
import fileinput
def modifyFile(file):
with fileinput.input(files=file, inplace=True, backup='.bak') as f:
for line in f:
if f.isfirstline():
print('// this is notes test\n' + line, end='')
else:
print(line, end='')
说明:此例子实现了在第一行之前添加一行注释的功能,当然,还可以实现更复杂的替换功能,可以替换多行、一行中的一部分等,如下替换行中内容"replace text"为"changed text"
def replaceText(files, src, dst):
with fileinput.input(files=files, inplace=True, backup='.bak') as f:
for line in f:
if src in line:
print(line.replace(src, dst), end='')
else:
print(line, end='')
调用方法,如下
# 将test.h中'*c'改成'*data'
replaceText('test.h', '*c', '*data')