Python比较配置文件的方法实例详解


Posted in Python onJune 06, 2019

工作中最常见的配置文件有四种:普通key=value的配置文件、Json格式的配置文件、HTML格式的配置文件以及YMAML配置文件。

这其中以第一种居多,后三种在成熟的开源产品中较为常见,本文只针对第一种配置文件。

一般来说Linux shell下提供了diff命令来比较普通文本类的配置文件,Python的difflib也提供了str和HTML的比较接口,但是实际项目中这些工具其实并不好用,主要是因为我们的配置文件并不是标准化统一化的。

为了解决此类问题,最好针对特定的项目写特定的配置文件比较工具,这样在版本发布时会很有用处。
其他话懒的说了,直接贴代码:

#!/usr/bin/python
#coding=utf-8
'''
此脚本适用于比较key=value格式的配置文件
使用方式为:
config_match.py old_file new_file
最终会将new_file中的新增配置项添加入old_file中,old_file中已有的配置项不会做任何改变。
'''
import re
import os,sys
reload(sys)
sys.setdefaultencoding("utf-8")
try:
  old_file = sys.argv[1]
  new_file = sys.argv[2]
except Exception,e:
  print("Error:" +str(e))
  print("Usage: config_match.py old_file new_file")
  sys.exit()
def list2dict(file):
  with open(file,'r') as f:
    list=f.readlines()
  #遍历str list,排除空行和以#开头的str,使用split将str元素转为[k,v]元素
  for e in list[0:]:
    if re.match('^#',e) or re.match('^$',e):
      list.remove(e)
  i=0
  for e in list:
    e_split=e.strip().split('=')
    if len(e_split)==2:
      k,v=e.strip().split('=')
      list[i]=[k,v]
    else:
      pass
    i=i+1
  #至此list变为了[[k,v],[k,v],...]这样的list
  #包含多个=号或者不包含=号的配置项会被忽略,这点要注意
  return dict(list)
old_dict=list2dict(old_file)
new_dict=list2dict(new_file)
'''
遍历新配置文件,将新增配置项加入conf_need_added{}字典中,然后将conf_need_added{}字典以k=v格式append入旧文件中。
如果重复的键值也需要更新那就太简单了,dict类型自带的update()方法就可以很好的完成任务,根本无需这么折腾了。
'''
conf_need_added={}
for k,v in new_dict.items():
  if k not in old_dict.keys():
    conf_need_added[k]=v
  else:
    pass
with open(old_file,'a') as f:
  for k,v in conf_need_added.items():
    f.write('\n#以下为新增配置项:\n')
    f.write(str(k)+'='+str(v)+'\n')

总结

以上所述是小编给大家介绍的Python比较配置文件的方法实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python算法学习之基数排序实例
Dec 18 Python
python修改操作系统时间的方法
May 18 Python
Python3 循环语句(for、while、break、range等)
Nov 20 Python
使用python读取txt文件的内容,并删除重复的行数方法
Apr 18 Python
python 脚本生成随机 字母 + 数字密码功能
May 26 Python
详解python之协程gevent模块
Jun 14 Python
Python2 Selenium元素定位的实现(8种)
Feb 25 Python
Python数据类型之List列表实例详解
May 08 Python
python3下载抖音视频的完整代码
Jun 05 Python
Python GUI学习之登录系统界面篇
Aug 21 Python
Python threading的使用方法解析
Aug 28 Python
使用pytorch和torchtext进行文本分类的实例
Jan 08 Python
Django中使用 Closure Table 储存无限分级数据
Jun 06 #Python
创建Django项目图文实例详解
Jun 06 #Python
Django网络框架之HelloDjango项目创建教程
Jun 06 #Python
python操作小程序云数据库实现简单的增删改查功能
Jun 06 #Python
Django网络框架之创建虚拟开发环境操作示例
Jun 06 #Python
浅析Python3中的对象垃圾收集机制
Jun 06 #Python
聊聊python里如何用Borg pattern实现的单例模式
Jun 06 #Python
You might like
php将session放入memcached的设置方法
2014/02/14 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
PHP类的反射用法实例
2014/11/03 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
PHP html_entity_decode()函数讲解
2019/02/25 PHP
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
2010/10/18 Javascript
简单实例处理url特殊符号&处理(2种方法)
2013/04/02 Javascript
JavaScript回调(callback)函数概念自我理解及示例
2013/07/04 Javascript
jQuery取id有.的值的方法
2014/05/21 Javascript
jquery validate.js表单验证入门实例(附源码)
2015/11/10 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
BootStrap智能表单demo示例详解
2016/06/13 Javascript
JSON与String互转的实现方法(Javascript)
2016/09/27 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
Vue CLI3搭建的项目中路径相关问题的解决
2018/09/17 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
2019/02/13 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
[53:20]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 VG vs OG
2018/04/03 DOTA
[52:14]VG vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[05:26]TI10典藏宝瓶套装外观展示
2020/07/03 DOTA
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
python实现简单的单变量线性回归方法
2018/11/08 Python
Django结合ajax进行页面实时更新的例子
2019/08/12 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
Python修改列表值问题解决方案
2020/03/06 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
澳大利亚在线消费电子产品商店:TobyDeals
2020/01/05 全球购物
2016寒假假期总结
2015/10/10 职场文书
心理健康教育培训研修感言
2015/11/18 职场文书
canvas绘制折线路径动画实现
2021/05/12 Javascript
浅谈GO中的Channel以及死锁的造成
2022/03/18 Golang