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行

总结

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

(0)

相关推荐

  • Python读写配置文件的方法

    本文实例讲述了Python读写配置文件的方法.分享给大家供大家参考.具体分析如下: python 读写配置文件在实际应用中具有十分强大的功能,在实际的操作中也有相当简捷的操作方案,以下的文章就是对python 读写配置文件的具体方案的介绍,相信对大家学习Python有所帮助. python 读写配置文件ConfigParser模块是python自带的读取配置文件的模块.通过他可以方便的读取配置文件. 这里就来简单介绍一下python 读写配置文件的方法. 配置文件.顾名思议就是存放配置信息的文件

  • python实现的解析crontab配置文件代码

    #/usr/bin/env python #-*- coding:utf-8 -*- """ 1.解析 crontab 配置文件中的五个数间参数(分 时 日 月 周),获取他们对应的取值范围 2.将时间戳与crontab配置中一行时间参数对比,判断该时间戳是否在配置设定的时间范围内 """ #$Id $ import re, time, sys from Core.FDateTime.FDateTime import FDateTime def

  • Python配置文件解析模块ConfigParser使用实例

    一.ConfigParser简介 ConfigParser 是用来读取配置文件的包.配置文件的格式如下:中括号"[ ]"内包含的为section.section 下面为类似于key-value 的配置内容. 复制代码 代码如下: [db]  db_host = 127.0.0.1  db_port = 22  db_user = root  db_pass = rootroot    [concurrent]  thread = 10  processor = 20 中括号"

  • Python读取properties配置文件操作示例

    本文实例讲述了Python读取properties配置文件操作.分享给大家供大家参考,具体如下: 工作需要将Java项目的逻辑改为python执行,Java的很多配置文件都是.properties的,文件内容的格式是"键.键.键...=值"的格式例如A.B.C=value1,D.F=value2等.并且"#"用来注视.python没有专门处理properties格式的包,只有处理标准的ini格式的包.所以需要自己写一个python程序来处理.不说了上程序. 这里参考

  • python用ConfigObj读写配置文件的实现代码

    发现一个简单而又强大的读写配置文件的lib,http://www.voidspace.org.uk/python/configobj.html.个人觉得最大的亮点在于自带的格式校验功能,并且支持复杂的嵌套格式,而且使用起来也相当的简便. 来看例子吧.读文件 复制代码 代码如下: from configobj import ConfigObj      config = ConfigObj(filename)      #      value1 = config['keyword1']     

  • Python中使用ConfigParser解析ini配置文件实例

    ini文件是windows中经常使用的配置文件,主要的格式为: 复制代码 代码如下: [Section1] option1 : value1 option2 : value2 python提供了一个简单的模块ConfigParser可以用来解析类似这种形式的文件.对于ConfigParser模块可以解析key:value和key=value这样的类型,对于#和;开头的行将会自动忽视掉.相当于注释行.常用的函数: 复制代码 代码如下: ConfigParser.RawConfigParser()

  • python中yaml配置文件模块的使用详解

    简述 和GNU一样,YAML是一个递归着说"不"的名字.不同的是,GNU对UNIX说不,YAML说不的对象是XML. YAML不是XML. 为什么不是XML呢?因为: YAML的可读性好. YAML和脚本语言的交互性好. YAML使用实现语言的数据类型. YAML有一个一致的信息模型. YAML易于实现. 上面5条也就是XML不足的地方.同时,YAML也有XML的下列优点: YAML可以基于流来处理: YAML表达能力强,扩展性好. 总之,YAML试图用一种比XML更敏捷的方式,来完成

  • Python运维自动化之nginx配置文件对比操作示例

    本文实例讲述了Python运维自动化之nginx配置文件对比操作.分享给大家供大家参考,具体如下: 文件差异对比diff.py #!/usr/bin/env python # import difflib import sys try: textfile1=sys.argv[1] textfile2=sys.argv[2] except exception,e: print "Error:"+str(2) print "Usge: difflib.py file1 file2

  • 在python的WEB框架Flask中使用多个配置文件的解决方法

    有些框架本身就支持多配置文件,例如Ruby On Rails,nodejs下的expressjs.python下的Flask虽然本身支持配置文件管理, 但单纯使用from_object和from_envvar却不是那么方便.有没有更好的办法? 答案是Flask-Environments这个包.它能通过FLASK_ENV环境变量自动选择开发环境配置或生产环境配置.使用之前要先安装: 复制代码 代码如下: $ sudo pip install Flask-Environments 然后修改confi

  • Python操作配置文件ini的三种方法讲解

    python 操作配置文件ini的三种方法 方法一:crudini 命令 说明 crudini命令是Linux下的一个操作配置文件的命令工具 用法 crudini --set [--existing] config_file section [param] [value] # 修改配置文件内容 crudini --get [--format=sh|ini] config_file [section] [param] # 获取配置文件内容 crudini --del [--existing] co

随机推荐