如何解决python - 将带有正确缩进的嵌套字典转储到 yaml
我非常接近于自动转储从数据框创建的 yml 文件以用于自动化任务。
def get_all_values(nested_dictionary):
for key,value in nested_dictionary.items():
model = {
"models": [
{
"name": key,"columns": None
}
]
}
yield(model)
for key,value in value.items():
table = [
{
"name": key,"tests": [
"not_null","unique"
]
}
]
yield(table)
nested_dictionary = d1
get_all_values(nested_dictionary)
data = get_all_values(nested_dictionary)
with open('data.yml','w') as outfile:
with redirect_stdout(outfile):
for i in data:
ruamel.yaml.round_trip_dump(i,outfile,indent=5,block_seq_indent=2)
它引用的字典作为生成器产生。 dicts 结构是:
{'models': [{'name': 'budgets_sales','columns': None}]}
[{'name': 'budget_amt','tests': ['not_null','unique']}]
[{'name': 'budget_group','unique']}]
[{'name': 'budget_name','unique']}]
[{'name': 'budget_pk','unique']}]
这“很好”...但输出如下:
models:
- name: budgets_sales
columns:
- name: budget_amt
tests:
- not_null
- unique
- name: budget_group
tests:
- not_null
- unique
- name: budget_name
tests:
- not_null
- unique
我要求字典中键的所有值都有一个额外的缩进。我不知道如何使值对键缩进。
如果正确,它看起来像这样:
- name: budgets_sales
columns:
- name: budget_amt
tests:
- not_null
- unique
- name: budget_group
tests:
- not_null
- unique
- name: budget_name
tests:
- not_null
- unique
- name: budget_pk
tests:
- not_null
- unique
- name: entry_type_code
tests:
- not_null
- unique
- name: institution_fk
tests:
- not_null
- unique
感谢 Anthon,这就是我最终使用的:
def get_all_values(nested_dictionary):
res = [{"version":2},{"models":None}]
for key,value in nested_dictionary.items():
seq = []
res.append([{"name": key,"columns": seq}])
# for key1,value1 in value.items(): # not using value1
for key1 in value.keys():
elem = {"name": key1,"tests": ["not_null","unique"]}
seq.append(elem)
return res
nested_dictionary = d1
get_all_values(nested_dictionary)
data = get_all_values(nested_dictionary)
with open('data.yml','w') as outfile:
with redirect_stdout(outfile):
for i in data:
yaml = ruamel.yaml.YAML()
yaml.indent(mapping=5,sequence=5,offset=4)
yml.dump(i,outfile)
解决方法
在您需要的输出中,与键 columns
关联的值是一个序列。
如果你的 Python 数据结构是一个列表,你只会得到它,所以请确保你
将您的个人 table
条目附加到某个变量。
我猜测 d1
基于您的“不正确”输出:
import sys
import ruamel.yaml
d1 = dict(budgets_sales=dict(budget_amt=None,budget_group=None,budget_name=None,budget_pk=None))
def get_all_values(nested_dictionary):
res = []
for key,value in nested_dictionary.items():
seq = []
res.append({"name": key,"columns": seq})
# for key1,value1 in value.items(): # not using value1
for key1 in value.keys():
elem = {"name": key,"tests": ["not_null","unique"]}
seq.append(elem)
return res
data = get_all_values(d1)
yaml = ruamel.yaml.YAML()
yaml.indent(mapping=5,sequence=5,offset=3)
yaml.dump(data,sys.stdout)
给出:
- name: budgets_sales
columns:
- name: budgets_sales
tests:
- not_null
- unique
- name: budgets_sales
tests:
- not_null
- unique
- name: budgets_sales
tests:
- not_null
- unique
- name: budgets_sales
tests:
- not_null
- unique
您应该考虑一些事项(除了在 SO 上更好地格式化您的代码和数据):
-
round_trip_dump
函数已被弃用,请勿在新代码中使用 - 至少从 2007 年 9 月起,推荐的包含 YAML 文档的文件扩展名为
.yaml
- 不要在多个阶段编写 YAML 文件,创建一个完整的数据结构并转储它。如果您希望在一个文件中包含多个 YAML 文档,请列出数据结构并使用
.dump_all()
方法。
如果所有其他方法都失败了,并且您有想要生成为输出的有效手工 YAML,请加载该 YAML(使用 YAML(typ='safe').load()
并检查您获得的 Python 中的数据结构。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。