我用的是Python 3.8.10ruamel 0.17.31.我有一本巨 Python 词典

d = {'a': {'b': {'c': {'x': 1, 'y': 1}, 'd': [1, 2, 3], 'e': {'f': 1, 'g': 1} }}}

使用ruamel.yaml,我希望它打印如下:

a:
  b:
    c:
      x: 1
      y: 1
    d: [1, 2, 3]
    e:
      f: 1
      g: 1

我想我是在混合流动和积木的风格.通过使用default_flow_style,我可以输出其中的任何一个

a:
  b:
    c:
      x: 1
      y: 1
    d:
    - 1
    - 2
    - 3
    e:
      f: 1
      g: 1

a:
  b:
    c: {x: 1, y: 1}
    d: [1, 2, 3]
    e: {f: 1, g: 1}

我需要编写一个定制的代理吗?

推荐答案

在以下情况下,您可以编写仅使用流样式发出序列的自定义表示器 该序列本身不包含任何集合(即只包含标量).这不是微不足道的,而且可能也不是必要的.

正如其他答案所指出的,即使你不知道该做什么,最好是 判断ruamel.yaml是否可以往返你想要的东西:

import sys
import ruamel.yaml

yaml_str = """\
a:
  b:
    c:
      x: 1
      y: 1
    d: [1, 2, 3]
    e:
      f: 1
      g: 1
"""
    
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)

这提供了:

a:
  b:
    c:
      x: 1
      y: 1
    d: [1, 2, 3]
    e:
      f: 1
      g: 1

因此,它可以往返您想要的东西,之后您可以判断您的特殊物品在装载过程中是如何构造的:

flow_list = data['a']['b']['d']
print(type(flow_list), flow_list)

然后,它可以提供:

<class 'ruamel.yaml.comments.CommentedSeq'> [1, 2, 3]

所以您需要构造一个CommentedSeq并搜索它,然后使用ruamel.yaml和flow样式 在StackOverflow上应该会得到有限的答案列表(例如 this one)

要给出一个完整的例子来从头开始构建并转储某个东西:

import sys
import ruamel.yaml

def FSlist(l):  # convert list into flow-style (default is block style)
    from ruamel.yaml.comments import CommentedSeq
    cs = CommentedSeq(l)
    cs.fa.set_flow_style()
    return cs

yaml = ruamel.yaml.YAML()
data = dict(a=dict(b=dict(c=dict(x=1, y=1), d=FSlist([1, 2, 3]), e=dict(f=1, g=1))))
yaml.dump(data, sys.stdout)

结果得到了接近你想要的东西:

a:
  b:
    c:
      x: 1
      y: 1
    d: [1, 2, 3]
    e:
      f: 1
      g: 1

Python相关问答推荐

symy.分段使用numpy数组

Python -Polars库中的滚动索引?

用gekko解决的ADE方程系统突然不再工作,错误消息异常:@错误:模型文件未找到.& &

将numpy数组存储在原始二进制文件中

重新匹配{ }中包含的文本,其中文本可能包含{{var}

海运图:调整行和列标签

Python键入协议默认值

ODE集成中如何终止solve_ivp的无限运行

numpy卷积与有效

部分视图的DataFrame

多指标不同顺序串联大Pandas 模型

Pandas GroupBy可以分成两个盒子吗?

搜索按钮不工作,Python tkinter

在二维NumPy数组中,如何 Select 内部数组的第一个和第二个元素?这可以通过索引来实现吗?

如何求相邻对序列中元素 Select 的最小代价

在极点中读取、扫描和接收有什么不同?

提取数组每行的非零元素

应用指定的规则构建数组

如何将返回引用的函数与pybind11绑定?

Python如何导入类的实例