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中使用dom模块生成XML文件示例
Apr 05 Python
Python通过Django实现用户注册和邮箱验证功能代码
Dec 11 Python
windows下python和pip安装教程
May 25 Python
Pycharm之快速定位到某行快捷键的方法
Jan 20 Python
python3实现mysql导出excel的方法
Jul 31 Python
python多进程(加入进程池)操作常见案例
Oct 21 Python
如何基于python测量代码运行时间
Dec 25 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
Apr 10 Python
Python暴力破解Mysql数据的示例
Nov 09 Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 Python
Python Pandas数据分析之iloc和loc的用法详解
Nov 11 Python
Python实现日志实时监测的示例详解
Apr 06 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和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
php 5.4 全新的代码复用Trait详解
2017/01/05 PHP
PHP使用DOM对XML解析处理操作示例
2019/07/04 PHP
JS中==与===操作符的比较
2009/03/21 Javascript
用js实现的自定义的对话框的实现代码
2010/03/21 Javascript
原生javascript实现无间缝滚动示例
2014/01/28 Javascript
JavaScript判断用户是否对表单进行了修改的方法
2015/03/18 Javascript
Javascript实现苹果悬浮虚拟按钮
2016/04/10 Javascript
jQuery悬停文字提示框插件jquery.tooltipster.js用法示例【附demo源码下载】
2016/07/19 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
AngularJS递归指令实现Tree View效果示例
2016/11/07 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
jQuery遮罩层实例讲解
2017/05/11 jQuery
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
如何在vue中使用ts的示例代码
2018/02/28 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
利用Electron简单撸一个Markdown编辑器的方法
2019/06/10 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
python logging日志模块的详解
2017/10/29 Python
Python 实现还原已撤回的微信消息
2019/06/18 Python
python实现简单五子棋游戏
2019/06/18 Python
Django基础知识 web框架的本质详解
2019/07/18 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)
2013/07/04 HTML / CSS
HTML5 UTF-8 中文乱码的解决方法
2013/11/18 HTML / CSS
毕业生找工作的求职信范文
2013/12/24 职场文书
驾驶员岗位职责
2014/01/29 职场文书
理工学院学生自我鉴定
2014/02/23 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
物理课外活动总结
2014/08/27 职场文书
房屋租赁意向书范本
2015/05/09 职场文书
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
openstack中的rpc远程调用的方法
2021/07/09 Python
详解Python中下划线的5种含义
2021/07/15 Python
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL
python在package下继续嵌套一个package
2022/04/14 Python