python学习笔记之--fileinput模块

简介

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')
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容