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新手实现2048小游戏
Mar 31 Python
Python利用前序和中序遍历结果重建二叉树的方法
Apr 27 Python
Python增量循环删除MySQL表数据的方法
Sep 23 Python
Python tkinter模块中类继承的三种方式分析
Aug 08 Python
Python引用传值概念与用法实例小结
Oct 07 Python
TensorFlow实现随机训练和批量训练的方法
Apr 28 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
Oct 22 Python
python2与python3的print及字符串格式化小结
Nov 30 Python
简单了解Python生成器是什么
Jul 02 Python
Python3 Click模块的使用方法详解
Feb 12 Python
python pandas移动窗口函数rolling的用法
Feb 29 Python
Python txt文件常用读写操作代码实例
Aug 03 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
实用函数3
2007/11/08 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
解析php通过cookies获取远程网页的指定代码
2013/06/25 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
2014/11/19 PHP
php intval函数用法总结
2019/04/14 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
前后台交互过程中json格式如何解析以及如何生成
2012/12/26 Javascript
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
HTML Color Picker(js拾色器效果)
2013/08/27 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
2013/11/20 Javascript
jquery中的查找parents与closest方法之间的区别
2013/12/02 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
2015/05/15 Javascript
jquery利用拖拽方式在图片上添加热链接
2015/11/24 Javascript
bootstrap下拉列表与输入框组结合的样式调整
2016/10/08 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
[03:00]2018完美盛典_最佳英雄奖
2018/12/17 DOTA
[09:13]DOTA2-DPC中国联赛 正赛 Ehome vs Magma 选手采访 1月19日
2021/03/11 DOTA
python练习程序批量修改文件名
2014/01/16 Python
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
pyenv命令管理多个Python版本
2017/03/26 Python
Python操作MySQL模拟银行转账
2018/03/12 Python
QML用PathView实现轮播图
2020/06/03 Python
如何将Pycharm中调整字体大小的方式设置为"ctrl+鼠标滚轮上下滑"
2020/11/17 Python
python实现控制台输出颜色
2021/03/02 Python
html5定制表单_动力节点Java学院整理
2017/07/11 HTML / CSS
亚马逊加拿大网站:Amazon.ca
2020/01/06 全球购物
房产委托公证书样本
2014/04/04 职场文书
支部书记四风问题自我剖析材料
2014/09/29 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
小学家长通知书评语
2014/12/31 职场文书
2015年“公民道德宣传日”活动方案
2015/05/06 职场文书
合同纠纷调解书
2015/05/20 职场文书
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android
MySQL池化框架学习接池自定义
2022/07/23 MySQL