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中使用装饰器时需要注意的一些问题
May 11 Python
Python3实现Web网页图片下载
Jan 28 Python
Django视图和URL配置详解
Jan 31 Python
python编写弹球游戏的实现代码
Mar 12 Python
对python创建及引用动态变量名的示例讲解
Nov 10 Python
利用python如何在前程无忧高效投递简历
May 07 Python
python剪切视频与合并视频的实现
Mar 03 Python
PythonPC客户端自动化实现原理(pywinauto)
May 28 Python
django form和field具体方法和属性说明
Jul 09 Python
python操作redis数据库的三种方法
Sep 10 Python
python3实现飞机大战
Nov 29 Python
python xlsxwriter模块的使用
Dec 24 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表单提交与$_POST实例分析
2015/01/26 PHP
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
PHP树形结构tree类用法示例
2019/02/01 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
javascript getElementsByTagName
2011/01/31 Javascript
js函数定时器实现定时读取系统实时连接数
2014/04/30 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
react路由配置方式详解
2017/08/07 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
vue技术分享之你可能不知道的7个秘密
2018/04/09 Javascript
微信小程序实现折叠展开效果
2018/07/19 Javascript
基于Vue-Cli 打包自动生成/抽离相关配置文件的实现方法
2018/12/09 Javascript
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
uni app仿微信顶部导航条功能
2019/09/17 Javascript
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
python 判断是否为正小数和正整数的实例
2017/07/23 Python
python的命名规则知识点总结
2019/10/04 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
Python xlrd/xlwt 创建excel文件及常用操作
2020/09/24 Python
CSS3实现多样的边框效果
2018/05/04 HTML / CSS
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
塔吉特百货公司官网:Target
2017/04/27 全球购物
市场营销专科应届生求职信
2013/11/24 职场文书
客户经理岗位职责大全
2015/04/09 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书