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使用htpasswd实现基本认证授权的例子
Jun 10 Python
python清除字符串里非数字字符的方法
Jul 02 Python
菜鸟使用python实现正则检测密码合法性
Jan 05 Python
python中函数总结之装饰器闭包详解
Jun 12 Python
关于Python如何避免循环导入问题详解
Sep 14 Python
python numpy函数中的linspace创建等差数列详解
Oct 13 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
May 16 Python
使用Python写一个量化股票提醒系统
Aug 22 Python
解析python实现Lasso回归
Sep 11 Python
numpy按列连接两个维数不同的数组方式
Dec 06 Python
如何基于Python代码实现高精度免费OCR工具
Jun 18 Python
Python基础之元类详解
Apr 29 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下的权限算法的实现
2007/04/28 PHP
PHP队列用法实例
2014/11/05 PHP
PHP里8个鲜为人知的安全函数分析
2014/12/09 PHP
PHP中Enum(枚举)用法实例详解
2015/12/07 PHP
JavaScript的Cookies
2008/01/16 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
jQuery实现简单的点赞效果
2020/05/29 Javascript
基于Javascript实现二级联动菜单效果
2016/03/04 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
ajax接收后台数据在html页面显示
2017/02/19 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
2017/09/14 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
2018/08/17 Javascript
vue 使用vue-i18n做全局中英文切换的方法
2018/10/29 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[44:30]完美世界DOTA2联赛PWL S2 GXR vs Magma 第一场 11.25
2020/11/26 DOTA
python实现合并两个数组的方法
2015/05/16 Python
开始着手第一个Django项目
2015/07/15 Python
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
在keras中model.fit_generator()和model.fit()的区别说明
2020/06/17 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
2021/02/03 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
香港太阳眼镜网上商店:SmartBuyGlasses香港
2016/07/22 全球购物
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
将时尚融入珠宝:Adornmonde
2019/10/17 全球购物
大学生党员承诺书
2014/05/20 职场文书
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis