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 urlopen()函数 示例分享
Jun 12 Python
Python网页解析利器BeautifulSoup安装使用介绍
Mar 17 Python
python访问系统环境变量的方法
Apr 29 Python
在Python程序和Flask框架中使用SQLAlchemy的教程
Jun 06 Python
Python 中Pickle库的使用详解
Feb 24 Python
详解关于Django中ORM数据库迁移的配置
Oct 08 Python
Django框架会话技术实例分析【Cookie与Session】
May 24 Python
使用OpenCV实现仿射变换—平移功能
Aug 29 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
Apr 02 Python
Python和Bash结合在一起的方法
Nov 13 Python
解决import tensorflow导致jupyter内核死亡的问题
Feb 06 Python
pytorch __init__、forward与__call__的用法小结
Feb 27 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 $_SERVER当前完整url的写法
2009/11/12 PHP
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
php制作简单模版引擎
2016/04/07 PHP
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
2007/02/09 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
jQuery插件EnPlaceholder实现输入框提示文字
2015/06/05 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
2015/08/06 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
浅析Jquery操作select
2016/12/13 Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
2018/11/28 Javascript
angular学习之动态创建表单的方法
2018/12/07 Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
2019/01/02 Javascript
react native 原生模块桥接的简单说明小结
2019/02/26 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
Python字符串格式化输出方法分析
2016/04/13 Python
轻量级的Web框架Flask 中模块化应用的实现
2017/09/11 Python
实例详解Python装饰器与闭包
2019/07/29 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
使用phonegap克隆和删除联系人的实现方法
2017/03/31 HTML / CSS
Pure Collection美国官网:来自英国羊绒专家的奢华羊绒
2017/11/19 全球购物
照片礼物和装饰:MyPhoto
2019/11/02 全球购物
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
营业员个人总结的自我评价
2013/10/25 职场文书
团支部建设方案
2014/05/02 职场文书
设备管理实施方案
2014/05/31 职场文书
电子专业自荐信
2014/07/01 职场文书
药店促销活动总结
2014/07/10 职场文书
幼儿园开学通知
2015/04/24 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书
同学会演讲稿
2019/04/02 职场文书
MySQL非空约束(not null)案例讲解
2021/08/23 MySQL
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang