需求:

两个文件,一个模块配置文件,一个本地配置文件。

本地配置文件            模版配置文件

无                              有                            使用模版文件中的项

有(空值)                    有                            使用模版文件中的项

有(非空值)                 有                            使用本地文件中的项

有                              无                            使用本地文件中的项 

根据模版文件和本地文件,最后合并到本地文件中!

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import yaml
import os
import io
import sys


argc = len(sys.argv)
#print(argc)
if argc != 3 :
	print("check_config.py template_config local_config")
	sys.exit(1)


template_config = sys.argv[1]
local_config = sys.argv[2]

print(template_config)
print(local_config)

if not os.path.isfile(template_config):
    print(template_config + " is not exists!")
    sys.exit(1)
    
if not os.path.isfile(local_config):
    print(local_config + " is not exists!")
    sys.exit(1)    
    
#open template_config
old = io.open(template_config, 'r', encoding="utf-8")
cfg_old = old.read()
dict_old = yaml.load(cfg_old,Loader=yaml.FullLoader)

#open local_config
new = io.open(local_config, 'r',encoding="utf-8")
cfg_new = new.read()
dict_new = yaml.load(cfg_new,Loader=yaml.FullLoader)


def merge_data(data_1, data_2):
    """
    使用 data_2 和 data_1 合成一个新的字典。
    对于 data_2 和 data_1 都有的 key,如果data_2为None,则用data_1,否则用data_2。
    :param data_1:
    :param data_2:
    :return:
    """
    if isinstance(data_1, dict) and isinstance(data_2, dict):
        new_dict = {}
        d2_keys = list(data_2.keys())
        for d1k in data_1.keys():
            if d1k in d2_keys:  # d1,d2都有。去往深层比对
                d2_keys.remove(d1k)
                new_dict[d1k] = merge_data(data_1.get(d1k), data_2.get(d1k))
            else:
                new_dict[d1k] = data_1.get(d1k)  # d1有d2没有的key
        for d2k in d2_keys:  # d2有d1没有的key
            new_dict[d2k] = data_2.get(d2k)
        return new_dict
    else:
        if data_2 == None:#d2为空使用d1
            return data_1
        else:             #d2不为空使用d2
            return data_2


result = merge_data(dict_old, dict_new)
#print(result)

old.close()
new.close()

#write result to local_config
yaml_file = open(local_config, 'w+')
yaml.dump(result,yaml_file,default_flow_style=False,encoding='utf-8',allow_unicode=True)
yaml_file.close() 

             

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐