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中暂存上传图片的方法
Feb 18 Python
利用Python的Django框架中的ORM建立查询API
Apr 20 Python
利用Anaconda简单安装scrapy框架的方法
Jun 13 Python
Python获取网段内ping通IP的方法
Jan 31 Python
python实现五子棋游戏
Jun 18 Python
使用 Django Highcharts 实现数据可视化过程解析
Jul 31 Python
解决python3 requests headers参数不能有中文的问题
Aug 21 Python
python队列原理及实现方法示例
Nov 27 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
Apr 08 Python
Selenium使用Chrome模拟手机浏览器方法解析
Apr 10 Python
python中类与对象之间的关系详解
Dec 16 Python
python数据处理之Pandas类型转换
Apr 28 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操作JSON格式数据的实现代码
2011/12/24 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
PHP开发的微信现金红包功能示例
2017/06/29 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
Firefox window.close()的使用注意事项
2009/04/11 Javascript
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
jquery异步跨域访问代码
2013/06/28 Javascript
js隐式全局变量造成的bug示例代码
2014/04/22 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
微信、QQ、微博、Safari中使用js唤起App
2018/01/24 Javascript
vue2.0 elementUI制作面包屑导航栏
2018/02/22 Javascript
浅谈React的最大亮点之虚拟DOM
2018/05/29 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
element的el-table中记录滚动条位置的示例代码
2019/11/06 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
Python日期时间对象转换为字符串的实例
2018/06/22 Python
Django 用户认证组件使用详解
2019/07/23 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
基于python实现操作git过程代码解析
2020/07/27 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
马克华菲官方商城:Mark Fairwhale
2016/09/04 全球购物
英国领先的高街书籍专家:Waterstones
2018/02/01 全球购物
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
在校生钳工实习自我鉴定
2013/09/19 职场文书
医院检讨书范文
2014/02/01 职场文书
中学生检讨书范文
2014/11/03 职场文书
2014年资料员工作总结
2014/11/18 职场文书
法学专业求职信范文
2015/03/19 职场文书
硕士学位申请报告
2015/05/15 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript