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中的装饰器使用
Jun 20 Python
python和ruby,我选谁?
Sep 13 Python
Python数据结构之顺序表的实现代码示例
Nov 15 Python
Python运维自动化之nginx配置文件对比操作示例
Aug 29 Python
Python3 Tkinter选择路径功能的实现方法
Jun 14 Python
django框架防止XSS注入的方法分析
Jun 21 Python
python多线程与多进程及其区别详解
Aug 08 Python
python禁用键鼠与提权代码实例
Aug 16 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
Feb 04 Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 Python
python爬虫使用正则爬取网站的实现
Aug 03 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
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
2017/04/18 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
javascript 控制input只允许输入的各种指定内容
2014/06/19 Javascript
javascript实现鼠标放上后下边对应内容变换的效果
2015/08/06 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
2016/10/26 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
2017/09/23 jQuery
Vue shopCart 组件开发详解
2018/01/26 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
微信小程序实现点击按钮后修改颜色
2019/12/05 Javascript
Python内置的字符串处理函数整理
2013/01/29 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
连接pandas以及数组转pandas的方法
2019/06/28 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
拉斯维加斯城市观光通行证:Las Vegas Pass
2019/05/21 全球购物
物业品质提升方案
2014/06/08 职场文书
教室布置标语
2014/06/26 职场文书
教师个人自我剖析材料
2014/09/29 职场文书
2014年安全管理工作总结
2014/12/01 职场文书
客房服务员岗位职责
2015/02/09 职场文书
十七岁的单车观后感
2015/06/12 职场文书
2016学雷锋优秀志愿者事迹材料
2016/02/25 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书