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 控制语句
Nov 03 Python
Python xlrd读取excel日期类型的2种方法
Apr 28 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
Dec 10 Python
selenium+PhantomJS爬取豆瓣读书
Aug 26 Python
Python OpenCV图像指定区域裁剪的实现
Oct 30 Python
django执行数据库查询之后实现返回的结果集转json
Mar 31 Python
python 已知平行四边形三个点,求第四个点的案例
Apr 12 Python
从python读取sql的实例方法
Jul 21 Python
python 写一个性能测试工具(一)
Oct 24 Python
Pytorch实验常用代码段汇总
Nov 19 Python
Pytorch 如何实现LSTM时间序列预测
May 17 Python
详解OpenCV曝光融合
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
我的论坛源代码(八)
2006/10/09 PHP
解析PHP处理换行符的问题 \r\n
2013/06/13 PHP
PHP实现数字补零功能的2个函数介绍
2014/05/12 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
用jquery实现自定义风格的滑动条实现代码
2011/04/26 Javascript
HTML,CSS,JavaScript速查表推荐
2014/12/02 Javascript
Bootstrap每天必学之按钮
2015/11/26 Javascript
canvas雪花效果核心代码分享
2017/02/19 Javascript
jQuery+Ajax实现用户名重名实时检测
2017/06/01 jQuery
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
vue中$refs的用法及作用详解
2018/04/24 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
2018/08/24 Javascript
javascript中UMD规范的代码推演
2018/08/29 Javascript
javascript function(函数类型)使用与注意事项小结
2019/06/10 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
Python3基础之输入和输出实例分析
2014/08/18 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
python实现提取str字符串/json中多级目录下的某个值
2020/02/27 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
通过CSS3的object-fit来调整图片适配尺寸的技巧简介
2016/02/27 HTML / CSS
FLIR美国官网:热成像, 夜视和红外摄像系统
2018/07/13 全球购物
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
传统软件工程与面向对象的软件工程有什么区别
2012/05/31 面试题
环境科学专业个人求职信
2013/09/26 职场文书
《一件运动衫》教学反思
2014/02/19 职场文书
任命书模板
2014/06/04 职场文书
护理目标管理责任书
2014/07/25 职场文书
2015年财务部工作总结
2015/04/10 职场文书
2015年大学教师工作总结
2015/05/20 职场文书
月考总结与反思
2015/10/22 职场文书
浅析MySQL如何实现事务隔离
2021/06/26 MySQL
MySQL索引是啥?不懂就问
2021/07/21 MySQL