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使用MySQLdb for Python操作数据库教程
Oct 11 Python
Python yield 使用方法浅析
May 20 Python
Python实现句子翻译功能
Nov 14 Python
Python实现基本数据结构中队列的操作方法示例
Dec 04 Python
Python标准库inspect的具体使用方法
Dec 06 Python
Python创建普通菜单示例【基于win32ui模块】
May 09 Python
python-django中的APPEND_SLASH实现方法
Jun 21 Python
python监控nginx端口和进程状态
Sep 06 Python
Django Admin后台添加数据库视图过程解析
Apr 01 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
Jul 23 Python
python实现人工蜂群算法
Sep 18 Python
python实现企业微信定时发送文本消息的实例代码
Nov 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中sprintf与printf函数用法区别解析
2014/02/17 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
PHP5.5和之前的版本empty函数的不同之处
2014/06/13 PHP
PHP简单实现合并2个数字键数组值的方法
2017/05/30 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
jquery自定义滚动条插件示例分享
2014/02/21 Javascript
javascript中with()方法的语法格式及使用
2014/08/04 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
jQuery实现的支持IE的html滑动条
2015/03/16 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
2017/05/17 Javascript
基于node.js制作简单爬虫教程
2017/06/29 Javascript
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
使用Angular CLI生成 Angular 5项目教程详解
2018/03/18 Javascript
jquery.pagination.js分页使用教程
2018/10/23 jQuery
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
手把手教你 CKEDITOR 4 实现Dialog 内嵌 IFrame操作详解
2019/06/18 Javascript
在Vue环境下利用worker运行interval计时器的步骤
2019/08/01 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
浅谈Python 对象内存占用
2016/07/15 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
解析python 类方法、对象方法、静态方法
2020/08/15 Python
HTML5 canvas标签实现刮刮卡效果
2015/04/24 HTML / CSS
LN-CC中国:高端男装和女装的奢侈时尚目的地
2019/09/14 全球购物
俄罗斯在线购买飞机票、火车票、巴士票网站:Tutu.ru
2020/03/16 全球购物
金融学专业大学生职业生涯规划
2014/03/07 职场文书
学生自我评语大全
2014/04/18 职场文书
学雷锋月活动总结
2014/04/25 职场文书
体育教育毕业生自荐信
2014/06/29 职场文书
电气工程师岗位职责
2015/02/12 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
volatile保证可见性及重排序方法
2022/08/05 Java/Android