问题描述
我具有以下内容:
| prnt_id | sub_id | ac_nm | cost | units |
| ------- | ------ | -------- | ----- | ----- |
| 123 | abc01 | abc corp | 34500 | 24 |
| 456 | abc02 | xyz corp | 9800 | 10 |
| 856 | abc03 | jfk corp | 9820 | 12 |
当我使用data = {"values": list(range(3)),'some_key': {'value': 2,'unit': 'm'}}
将此字典转储到YAML时,我得到了以下内容:
default_flow_style=True
我想转储该命令,使>>> print(yaml.dump( data,default_flow_style=False))
some_key:
unit: m
value: 2
values:
- 0
- 1
- 2
>>> print(yaml.dump( data,default_flow_style=True))
{some_key: {unit: m,value: 2},values: [0,1,2]}
>>> print(yaml.dump( data,default_flow_style=None))
some_key: {unit: m,value: 2}
values: [0,2]
保持flow_style(就像使用values
和default_flow_style=None
执行时一样,但保持default_flow_style=True
的行为与使用{ {1}}。
有可能实现这一目标吗?
使用PyYAML 5.3.1
解决方法
如果不更改转储程序中的表示形式,则无法使用PyYAML达到该目标。
在ruamel.yaml中,您可以将一个节点标记为以流模式进行转储,然后将所有“以下”的内容也转储为流模式(必须):
import sys
import ruamel.yaml
def flist(x):
retval = ruamel.yaml.comments.CommentedSeq(x)
retval.fa.set_flow_style() # fa -> format attribute
return retval
data = {"values": flist(range(3)),'some_key': {'value': 2,'unit': 'm'}}
yaml = ruamel.yaml.YAML()
yaml.dump(data,sys.stdout)
给出:
values: [0,1,2]
some_key:
value: 2
unit: m
首先获得values
键,因为它在data
的定义中位于第一位(假设您使用的是最新的Python 3)