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


Posted in Python onNovember 18, 2019

应用场景:配置文件由于升级改动了,我们想看看升级后的配置文件相对于之前的改动了哪些配置项

注意:这个脚本只能检测的配置文件是键值对的形式,就是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

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

file2:

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

运行: 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行

总结

以上所述是小编给大家介绍的Python3实现配置文件差异对比脚本,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python的迭代器和生成器使用实例
Jan 14 Python
python数组过滤实现方法
Jul 27 Python
Python中optparser库用法实例详解
Jan 26 Python
python列表list保留顺序去重的实例
Dec 14 Python
Python查找文件中包含中文的行方法
Dec 19 Python
Python3获取拉勾网招聘信息的方法实例
Apr 03 Python
Python绘图实现显示中文
Dec 04 Python
代码总结Python2 和 Python3 字符串的区别
Jan 28 Python
使用keras和tensorflow保存为可部署的pb格式
May 25 Python
python转化excel数字日期为标准日期操作
Jul 14 Python
Python类绑定方法及非绑定方法实例解析
Oct 09 Python
python单向链表实例详解
May 25 Python
Python(PyS60)实现简单语音整点报时
Nov 18 #Python
wxPython实现整点报时
Nov 18 #Python
python字符串的拼接方法总结
Nov 18 #Python
python将字符串转变成dict格式的实现
Nov 18 #Python
在Python中使用filter去除列表中值为假及空字符串的例子
Nov 18 #Python
python实现输出一个序列的所有子序列示例
Nov 18 #Python
Python中的四种交换数值的方法解析
Nov 18 #Python
You might like
php 获取全局变量的代码
2011/04/21 PHP
深入PHP内存相关的功能特性详解
2013/06/08 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
2013/06/29 PHP
详解PHP错误日志的获取方法
2015/07/20 PHP
PHP在线调试执行的实现方法(附demo源码)
2016/04/28 PHP
php版微信返回用户text输入的方法
2016/11/14 PHP
php str_replace替换指定次数的方法详解
2017/05/05 PHP
如何解决PHP获取不到SESSION信息之一般情况
2019/10/10 PHP
PHP命名空间(namespace)原理与用法详解
2019/12/11 PHP
Javascript常考语句107条收集
2010/03/09 Javascript
js 利用className得到对象的实现代码
2011/11/15 Javascript
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
详解微信小程序开发之下拉刷新 上拉加载
2016/11/24 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
微信小程序选择图片和放大预览图片功能
2017/11/02 Javascript
原生JS实现的轮播图功能详解
2018/08/06 Javascript
Vue cli构建及项目打包以及出现的问题解决
2018/08/27 Javascript
vue-router跳转时打开新页面的两种方法
2019/07/29 Javascript
JS实现拖拽元素时与另一元素碰撞检测
2020/08/27 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
Python栈算法的实现与简单应用示例
2017/11/01 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
医药营销专业个人自荐信
2013/09/29 职场文书
生物化学研究助理员求职信
2013/10/09 职场文书
年度考核个人总结
2015/03/06 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python