python - 将带有正确缩进的嵌套字典转储到 yaml

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?