python3实现配置文件差异对比脚本

应用场景:配置文件由于升级改动了,我们想看看升级后的配置文件相对于之前的改动了哪些配置项
注意:这个脚本只能检测的配置文件是键值对的形式,就是key=value的形式
我在网上找了好久没找到这一块的案例,大部分都是用一些difflib库做的可视化对比,所以自己尝试写了一个

# 该脚本实现两个配置文件中,新文件相对于旧文件的增删改的配置项输出功能
# 配置文件必须是key = value的形式

import re
import sys

def data2list(file_stream):
    """
    生成器
    :param file_stream:接收打开的文件对象
    :return:
    """
    for line in file_stream:
        line = line.strip()
        if line == "": #过滤空行
            continue
        line = line.split(" = ") #每行转为列表
        line2tuple = tuple(line) #列表转元组
        yield line2tuple #每次返回一个元组

def line_count(keywords, filename):
    """
    :param keywords: 对比旧文件,在新文件中改变值的键名或新增的键
    :return: 返回键所在的行号
    :filename 文件名称
    """
    count = 1
    with open(filename) as fp:
        for line in fp:
            line = line.strip()
            if re.search(keywords, line):
                return count
            count += 1

#比较新文件中配置型值改变的和新增的配置
def compare_config():
    """
    遍历新文件中的每个键是否在旧文件中存在,如果存在,则比较值是否相同,不相同则打印配置更新,和所在的位置
    否则视为在新文件中新增的项
    :return:
    """
    global dict1,dict2
    for k2 in dict2.keys():
        k1 = list(dict1.keys())
        if k2 in k1:
            if dict2[k2] != dict1[k2]:
                count = line_count(k2, file2)
                print("配置项值更新:%s=%s-->%s=%s,位置在第%s行" %(k2, dict1[k2],k2, dict2[k2], count))
        else:
            count = line_count(k2,file2)
            print("新增配置项:%s=%s,位置在第%s行" %(k2, dict2[k2], count))

    # 新文件中删除了哪些项,在旧文件中有,在新文件中没有的项
    set1 = set(dict1.keys())
    set2 = set(dict2.keys())
    deleteKeys = set1 - set2
    for k1 in deleteKeys:
        count = line_count(k1, file1)
        print("新文件中删除了以下配置:%s=%s,位置在旧文件中的第%s行" %(k1, dict1[k1],count))

if __name__ == ‘__main__‘:
    try:
        file1 = sys.argv[1]
        file2 = sys.argv[2]
    except:
        print("userage:xxx.py oldfile newfile")
        sys.exit(1)
    fp1 = open(file1)
    fp2 = open(file2)

    #通过生成器的具有迭代器特点,遍历来生成一个列表,列表中嵌套了数组,每个数组里面村了每行的数据
    gen1 = data2list(fp1)
    list1 = []
    for i in gen1:
        list1.append(i)
    dict1 = dict(list1) # dict函数可以把列表中嵌套的元组转为字典

    gen2 = data2list(fp2)
    list2 = []
    for i in gen2:
        list2.append(i)
    dict2 = dict(list2)

    fp1.close()
    fp2.close()

    compare_config()

测试结果如下:
准备两个文件
file1

file2:

运行: config_compare.py file1 file2
输出比较结果:
配置项值更新:age=19-->age=20,位置在第3行
配置项值更新:gender=man-->gender=female,位置在第4行
配置项值更新:apple=5-->apple=6,位置在第6行
新增配置项:peach=2,位置在第9行
新增配置项:hello=world,位置在第11行
新增配置项:language=english,位置在第12行
新文件中删除了以下配置:banana=3,位置在旧文件中的第8行
新文件中删除了以下配置:name=wangtao,位置在旧文件中的第2行

原文地址:https://blog.51cto.com/13560219/2450949

时间: 2025-02-01 19:39:46

python3实现配置文件差异对比脚本的相关文章

python-文件内容差异对比

通过difflib模块实现文件内容差异对比,它是Python的标准库模块,不需要单独安装,作用是对比文件之间的差异.而且支持输出HTML文档,我们可以用difflib对比代码和配置文件的差别. 1.对比两个字符串的差别 打印一下运行结果: 理解一下输出的内容: "-"符号:包含在第一个序列中,但不包含在第二个序列中: "+"符号:包含在第二个序列中,但不包含在第一个序列中: ""(也就是空):两个序列行一致: "?"符号:表示

Lua和Javascript差异对比

Lua模拟器js方案 1.语法级模拟lua与js语言差异 1.1注释 js 为//,lua为--. 1.2变量js利用val来声明全局变量不存在局部变量,lua则不需要直接定位则为全局变量,local声明则为局部变量. 1.3运算符js + - * / % ++ --= += -= *= /= %=支持字符串 +txt1 = "what a very";txt2 = "nice day";txt3 =txt1 " " +txt2;打印txt3输出

Python自动化运维——文件内容差异对比

Infi-chu: http://www.cnblogs.com/Infi-chu/ 模块:difflib 安装:Python版本大于等于2.3系统自带 功能:对比文本之间的差异,而且支持输出可读性比较强的HTML文档,与Linux中的diff命令比较相似. 两个字符串的差异对比: #import difflib #text1=''' #hello world. #how are you. #nice to meet you. #''' #text1_lines=text1.splitlines

Atitit 硬件 软件 的开源工作 差异对比

Atitit 硬件 软件 的开源工作 差异对比 1.1. 模块化,标准化,以及修改的便捷性1 1.2. 生产和发布成本 1 1.3.   3. 入行门槛搞2 1.4.  在软件业极度发达的今天,任何具有良好逻辑思维能力的人只要感兴趣,就可以通过互联网获得足够的教育从而称为一名软件开发人员.2 1.5. Sdx软件定义一切2 1.1. 模块化,标准化,以及修改的便捷性 1. 软件产品都有着定义完整,并且可以随时调整的输入输出. ,这就使得软件的开发人员之间可以仅仅通过定义好的接口来互相合作,而无论

SeaJS 与 RequireJS 的差异对比

这篇文章主要介绍了SeaJS 与 RequireJS 的差异对比,本文主要对CMD规范和AMD规范的弊端做了对比,并做出了一个总结,需要的朋友可以参考下 “历史不是过去,历史正在上演.随着 W3C 等规范.以及浏览器的飞速发展,前端的模块化开发会逐步成为基础设施.一切终究都会成为历史,未来会更好.”——引用玉伯原文最后一段话,我个人也非常赞同.既然谈到了“未来”,我个人认为:前端 js 模块如果继续发展,其模块格式很可能会成为未来 WEB 一种标准规范,产生多种实现方式.就好比 JSON 格式一

difflib文件差异对比

1.两个字符串差异对比: #!/usr/bin/env python # -*- coding:utf-8 -*- import difflib text1 = '''text1: This module provides classes and functions for comparing sequences. including HTML and context and unified diffs. difflib document v7.4 add string ''' text1_li

文件与目录差异对比模块filecmp

简介 当我们进行代码审计或校验备份结果时,往往需要检查原始与目标目录的文件一致性,python的标准库已经自带了满足此需求的模块filecmp.filecmp可以实现文件.目录.遍历子目录的差异对比功能.比如报告中输出目标目录比原始多出的文件或子目录,即使文件同名也会判断是否为同一个文件(内容级对比)等,python2.3以上版本自带了filecmp模块,无需额外安装. 模块常用方法说明 filecmp 提供了三个操作方法,分别为cmp(单文件对比).cmpfiles(多文件对比).dircmp

在线文本差异对比

在线文本差异对比 本工具可以方便大家快速对比两个文本文件中的不同之处.结果清晰明了,可快带 替换差异内容并将结果直接下载. ... 在线文本比较工具 http://www.jq22.com/textDifference http://tool.99wu.cn/textdifference/index.html http://www.newjson.com/Static/Tools/Diff.html 原文地址:https://www.cnblogs.com/xuanbjut/p/10894076

Linux VIM8 Python3 编辑器配置文件

Linux VIM8 Python3 编辑器配置文件 "---------------------简单配置------------------------- set nocompatible "关闭与vi的兼容模式 set number "显示行号 set nowrap "不自动折行 set showmatch "显示匹配的括号 set scrolloff=3 "距离顶部和底部3行" set encoding=utf-8 "编