Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
替换JSON文件中YAML的值-Python 3_Python_Json_Python 3.x_Parsing_Yaml - Fatal编程技术网

替换JSON文件中YAML的值-Python 3

替换JSON文件中YAML的值-Python 3,python,json,python-3.x,parsing,yaml,Python,Json,Python 3.x,Parsing,Yaml,我想使用Python 3将YAML文件中的值替换为JSON文件 我有许多JSON文件,我希望从主YAML文件中获取值,并仅替换某些值,如源服务器ip、电子邮件、主机名 例如,我有这个YAML文件(mast_conf.YAML): -源系统1: sourceServer:1.2.3.500 邮寄地址:gokul@gmail.com -资料来源系统2: sourceServer1:2.2.3.500 sourceServer2:3.2.3.500 邮寄地址:gokul@gmail.com JSON

我想使用Python 3将YAML文件中的值替换为JSON文件

我有许多JSON文件,我希望从主YAML文件中获取值,并仅替换某些值,如源服务器ip、电子邮件、主机名

例如,我有这个YAML文件(mast_conf.YAML):

-源系统1:
sourceServer:1.2.3.500
邮寄地址:gokul@gmail.com
-资料来源系统2:
sourceServer1:2.2.3.500
sourceServer2:3.2.3.500
邮寄地址:gokul@gmail.com
JSON文件(sourcesystem1.JSON):

另一个JSON文件(sourcesystem2.JSON):

下面是我试图解析json文件中的值的代码

import json
import yaml


with open("master_conf.yaml", 'r') as f:
yaml_config = yaml.safe_load(f)


yaml_config = {
list(config.keys()[0]): list(config[config.keys()[0]])
for config in yaml_config
}


json_files = ( "sourcesystem1.json",
"sourcesystem2.json",
)


for json_file in json_files:
with open(json_file, "r") as f:
sourcesystem_conf = json.load(f)


sourcesystem = sourcesystem_conf["source"]


if sourcesystem in yaml_config:
for key, value in yaml_config[sourcesystem].items():
sourcesystem_conf[key] = value


with open(json_file, "w") as f:
json.dump(sourcesystem_conf, f, indent=2)
我通过程序得到以下错误

TypeError: 'dict_keys' object does not support indexing

When I run indivudually I get this issue for yaml

>>> yaml_config = { ... config.keys()[0]: config[config.keys()[0]] ... for config in yaml_config ... } Traceback (most recent call last): File "<stdin>", line 3, in <module> File "<stdin>", line 3, in <dictcomp> TypeError: 'dict_keys' object is not subscriptable >>>
TypeError:“dict_keys”对象不支持索引
当我单独运行时,我为yaml收到了这个问题
>>>yaml_config={…config.keys()[0]:config[config.keys()[0]..用于yaml_config…}中的配置回溯(最近一次调用):文件“”,第3行,在文件“”中,第3行,在类型错误中:“dict_keys”对象不可订阅>>
是否有更简单的方法来实现我的最终目标,即我希望从Yaml配置文件替换JSON文件中的值


这需要以自动方式更新1000个Json文件,以便从主Yaml文件更新它。

最简单的方法是使用pyyaml,请参阅

然后,您可以使用它加载yaml文件:

>>导入yaml
>>>yaml\u config=yaml.safe\u加载(yaml\u文件)
>>>yaml_配置
[{'sourcesystem1':{'MailTo':'gokul@gmail.com','sourceServer':'1.2.3.500'},
{'sourcesystem2':{'MailTo':'gokul@gmail.com',
“sourceServer1”:“2.2.3.500”,
'sourceServer2':'3.2.3.500'}]
使用源系统作为键操作dict会更容易

在python 2中,aDict.keys()返回一个列表,以便执行以下操作:

>>yaml\u配置={
config.keys()[0]:config[config.keys()[0]]
对于yaml_配置中的配置
}
>>>yaml_配置
{'sourcesystem1':{'MailTo':'gokul@gmail.com','sourceServer':'1.2.3.500'},
'sourcesystem2':{'MailTo':'gokul@gmail.com',
“sourceServer1”:“2.2.3.500”,
'sourceServer2':'3.2.3.500'}
在python 3中,
aDict.keys()
不再返回列表,因此您可以简单地使用for循环:

yaml_config = {}
for config in yaml_config_raw:
    source = [key for key in config][0]
    yaml_config[source] = config[source]
然后,您可以迭代json文件来更新它们:

导入json
进口yaml
开放式(“mast_conf.yaml”和“r”)作为f:
yaml_配置_原始=yaml.safe_负载(f)
yaml_配置={}
对于yaml_config_raw中的配置:
source=[key for key in config][0]
yaml_配置[源]=配置[源]
json_文件=(
“sourcesystem1.json”,
“sourcesystem2.json”,
)
对于json_文件中的json_文件:
将open(json_文件,“r”)作为f:
sourcesystem_conf=json.load(f)
sourcesystem=sourcesystem_conf[“source”]
如果源系统在yaml_配置中:
对于键,在yaml_配置[sourcesystem].items()中输入值:
sourcesystem_conf[key]=值
打开(json_文件,“w”)作为f:
dump(sourcesystem_conf,f,indent=2)

如何使用pyyaml库加载文件()并使用json库构建输出文件()?请确切描述您在执行此任务时遇到的问题。我们很乐意帮助您找出代码中的错误或解释您不理解的内容,但您似乎只是在寻求解决方案。谢谢。我试着跑。我收到这个错误,很抱歉是json.loadimport json import yaml import sys,open(“master_conf.yaml”,“r”)为f:yaml_config=yaml.safe_load(f)json_file=sys.argv[1],用于json_文件中的json_文件:open(json_file,'r')为f:sourcesystem_conf=json.load(f)sourcesystem=sourcesystem_conf[“source”]如果yaml_-config中的sourcesystem:for key,yaml_-config[sourcesystem].items():sourcesystem_-conf[key]=value-print('export{}={}.format(key,value)),open(json_-file,“w”)为f:json.dump(sourcesystem_-conf,f,indent=2),我得到错误-FileNotFoundError:[Errno 2]没有这样的文件或目录:“t”这里的json文件中的值不会被替换。打印空行。当我打印值时
TypeError: 'dict_keys' object does not support indexing

When I run indivudually I get this issue for yaml

>>> yaml_config = { ... config.keys()[0]: config[config.keys()[0]] ... for config in yaml_config ... } Traceback (most recent call last): File "<stdin>", line 3, in <module> File "<stdin>", line 3, in <dictcomp> TypeError: 'dict_keys' object is not subscriptable >>>
yaml_config = {}
for config in yaml_config_raw:
    source = [key for key in config][0]
    yaml_config[source] = config[source]