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基础教程之自定义函数介绍
Aug 29 Python
零基础写python爬虫之使用Scrapy框架编写爬虫
Nov 07 Python
python在windows下创建隐藏窗口子进程的方法
Jun 04 Python
让python 3支持mysqldb的解决方法
Feb 14 Python
微信跳一跳小游戏python脚本
Jan 05 Python
浅谈Python实现2种文件复制的方法
Jan 19 Python
使用python验证代理ip是否可用的实现方法
Jul 25 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
Jan 10 Python
python使用MQTT给硬件传输图片的实现方法
May 05 Python
Python3标准库之functools管理函数的工具详解
Feb 27 Python
python实现银行账户系统
Feb 22 Python
pytorch 把图片数据转化成tensor的操作
Mar 04 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随机数生成代码与使用实例分析
2011/04/08 PHP
显示程序执行时间php函数代码
2013/08/29 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
smarty缓存用法分析
2014/12/16 PHP
php通过前序遍历树实现无需递归的无限极分类
2015/07/10 PHP
PHP count_chars()函数讲解
2019/02/14 PHP
PHP观察者模式定义与用法实例分析
2019/03/22 PHP
Aptana调试javascript图解教程
2009/11/30 Javascript
script标签的 charset 属性使用说明
2010/12/04 Javascript
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
vue+vuecli+webpack中使用mockjs模拟后端数据的示例
2017/10/24 Javascript
重学JS 系列:聊聊继承(推荐)
2019/04/11 Javascript
React优化子组件render的使用
2019/05/12 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
python读取oracle函数返回值
2016/07/18 Python
Python中遍历列表的方法总结
2019/06/27 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
2020/06/04 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
英国男女奢华内衣和泳装购物网站:Figleaves
2017/01/28 全球购物
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
什么是反射
2012/03/17 面试题
高中自我评价范文
2014/01/27 职场文书
中学教师教育感言
2014/02/21 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
个人政风行风自查自纠报告
2014/10/21 职场文书
公积金贷款承诺书
2015/04/30 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript
在Spring-Boot中如何使用@Value注解注入集合类
2021/08/02 Java/Android
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript