【问题标题】:Replace values from YAML in JSON file - Python 3替换 JSON 文件中 YAML 中的值 - Python 3
【发布时间】:2020-09-05 09:34:31
【问题描述】:

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

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

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

-  sourcesystem1:
    sourceServer: 1.2.3.500
    MailTo: gokul@gmail.com
-  sourcesystem2:
    sourceServer1: 2.2.3.500
    sourceServer2: 3.2.3.500
    MailTo: gokul@gmail.com

一个 JSON 文件(sourcesystem1.json):

{
    "source":"sourcesystem1",
    "frequency":"daily",
    "sourceServer":"1.2.1.2",
    "hostName":"1.2.1.3",
    "fileFormat":"csv",
    "delimiterType":"semicolon"
}

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

{
    "source":"sourcesystem2",
    "frequency":"daily",
    "sourceServer":"1.2.3.2",
    "hostName":"1.2.1.7",
    "fileFormat":"csv",
    "delimiterType":"commaseperated"
}

下面是我尝试从 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 >>>

是否有更简单的方法来实现我想要从 Yaml 配置文件中替换 JSON 文件中的值的最终目标

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

【问题讨论】:

标签: python json python-3.x parsing yaml


【解决方案1】:

最简单的方法是使用pyyaml,见Jon's answer

然后你可以使用它来加载你的 yaml 文件:

>>> import yaml
>>> yaml_config = yaml.safe_load(yaml_file)
>>> yaml_config
[{'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 2 中 aDict.keys() 返回一个列表,因此以下内容将起作用:

>>> yaml_config = {
    config.keys()[0]: config[config.keys()[0]]
    for config in yaml_config
}
>>> yaml_config
{'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 文件来更新它们:

import json
import yaml

with open("mast_conf.yaml", 'r') as f:
    yaml_config_raw = yaml.safe_load(f)


yaml_config = {}
for config in yaml_config_raw:
    source = [key for key in config][0]
    yaml_config[source] = config[source]

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)

【讨论】:

  • 谢谢。我试着跑。我收到此错误
  • 抱歉是 json.load
  • import json import yaml import sys with open("master_conf.yaml", 'r') as f: yaml_config = yaml.safe_load(f) json_file=sys.argv[1] for json_file in json_file : 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 print ('export {}={}'.format(key, value)) with open(json_file, "w") as f: json.dump(sourcesystem_conf, f, indent=2)
  • 我收到错误 - FileNotFoundError: [Errno 2] No such file or directory: 't'
  • 这里的 json 文件中的值没有被替换。打印空行。当我打印值时
猜你喜欢
  • 2021-11-30
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 2019-05-01
  • 1970-01-01
相关资源
最近更新 更多