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 相关文章推荐
一则python3的简单爬虫代码
May 26 Python
python实现爬取千万淘宝商品的方法
Jun 30 Python
解决vscode python print 输出窗口中文乱码的问题
Dec 03 Python
Centos部署django服务nginx+uwsgi的方法
Jan 02 Python
python实现控制台打印的方法
Jan 12 Python
python读取.mat文件的数据及实例代码
Jul 12 Python
Python连接字符串过程详解
Jan 06 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
Apr 13 Python
Python使用多进程运行含有任意个参数的函数
May 02 Python
python调用API接口实现登陆短信验证
May 10 Python
python框架flask入门之路由及简单实现方法
Jun 07 Python
Python入门之基础语法详解
May 11 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_imagick实现复古效果的方法
2016/10/18 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
JavaScript方法和技巧大全
2006/12/27 Javascript
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
Jquery弹出窗口插件 LeanModal的使用方法
2012/03/10 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
JavaScript实现的购物车效果可以运用在好多地方
2014/05/09 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
详解基于electron制作一个node压缩图片的桌面应用
2019/01/29 Javascript
微信内置开发 iOS修改键盘换行为搜索的解决方案
2019/11/06 Javascript
VUE.CLI4.0配置多页面入口的实现
2019/11/25 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
[01:34]传奇从这开始 2016国际邀请赛中国区预选赛震撼开启
2016/06/26 DOTA
python之文件读取一行一行的方法
2018/07/12 Python
在django中实现choices字段获取对应字段值
2020/07/12 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
Canvas系列之滤镜效果
2019/02/12 HTML / CSS
英国专业美容产品在线:Mylee(从指甲到脱毛)
2020/07/06 全球购物
德国的各种媒体在线商店:Thalia.de(书籍、电子书、玩具等)
2020/10/08 全球购物
学生社团文化节开幕式主持词
2014/03/28 职场文书
就业协议书怎么填
2014/04/11 职场文书
局火灾防控工作方案
2014/05/25 职场文书
房产公证书格式
2015/01/26 职场文书
小学教师求职信范文
2015/03/20 职场文书
污水处理保证书
2015/05/09 职场文书
企业文化学习心得体会
2016/01/21 职场文书
2016党风廉政建设心得体会范文
2016/01/25 职场文书