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 相关文章推荐
在ironpython中利用装饰器执行SQL操作的例子
May 02 Python
Python Socket传输文件示例
Jan 16 Python
老生常谈Python基础之字符编码
Jun 14 Python
简单了解python模块概念
Jan 11 Python
Python爬虫爬取一个网页上的图片地址实例代码
Jan 16 Python
Python类装饰器实现方法详解
Dec 21 Python
Python音频操作工具PyAudio上手教程详解
Jun 26 Python
Python PyInstaller库基本使用方法分析
Dec 12 Python
keras模型保存为tensorflow的二进制模型方式
May 25 Python
python实现npy格式文件转换为txt文件操作
Jul 01 Python
详解Python中如何将数据存储为json格式的文件
Nov 18 Python
解决Python字典查找报Keyerror的问题
May 26 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
Adnroid 微信内置浏览器清除缓存
2016/07/11 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
2016/10/29 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
2011/07/27 Javascript
JavaScript中的关键字"VAR"使用详解 分享
2013/07/31 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
javaScript语法总结
2016/11/25 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
利用angular、react和vue实现相同的面试题组件
2018/02/19 Javascript
微信小程序实现红包雨功能
2018/07/11 Javascript
微信小程序动态增加按钮组件
2018/09/14 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
2020/02/14 Javascript
Vue中添加滚动事件设置的方法详解
2020/09/14 Javascript
[04:54]DOTA2 2017国际邀请赛:上届冠军WINGS采访短片
2017/08/09 DOTA
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
Python 爬虫学习笔记之正则表达式
2016/09/21 Python
python编辑用户登入界面的实现代码
2018/07/16 Python
python的concat等多种用法详解
2018/11/28 Python
python存储16bit和32bit图像的实例
2018/12/05 Python
python版本五子棋的实现代码
2018/12/11 Python
python把ipynb文件转换成pdf文件过程详解
2019/07/09 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
python实现银行实战系统
2020/02/26 Python
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
美国猫狗药物和用品网站:PetCareRx
2017/01/05 全球购物
小学生读书感言
2014/02/12 职场文书
党的群众路线查摆剖析材料
2014/10/10 职场文书
电工实训报告总结
2014/11/05 职场文书
学生上课迟到检讨书
2015/01/01 职场文书
Python实现socket库网络通信套接字
2021/06/04 Python
使用Springboot实现健身房管理系统
2021/07/01 Java/Android
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python
html,css,javascript是怎样变成页面的
2023/05/07 HTML / CSS