我有一个python项目,我想在其中使用yaml(pyyaml 3.11),特别是因为它“漂亮”,用户可以在必要时在文本编辑器中编辑。不过,我的问题是,如果我将yaml引入到一个python应用程序中(我需要这样做)并编辑内容(我需要这样做),那么编写新文档通常不如开始时那么漂亮。
pyyaml文档非常糟糕,甚至没有将参数记录到dump函数中。我发现了。但是,我仍然缺少我需要的信息。(我开始看消息来源,但似乎不是最吸引人的。如果我不能在这里找到解决方案,那就是我唯一的办法。)
我从一个看起来像这样的文档开始:
-绿色:
输入:
-港口事件:
小部件提示:文件名
小部件帮助:选择文件名
-端口目标路径:
小部件提示:路径
value:'东西'
输出:
-端口值:
小部件提示:字符串
文本:|
我迷路了,我找到了
我像狼一样饿。
在加载到python(yaml.safe_load(s))之后,我尝试了两种方法将其转储:
>>>打印yaml.dump(d3,默认_-flow_-style=false,默认_-style='')
-绿色:
输入:
-港口事件:
小部件帮助:选择文件名
小部件提示:文件名
-端口目标路径:
价值:东西
小部件提示:路径
输出:
-端口值:
小部件提示:字符串
短信:“我迷路了,我找到了。”
我饿得像狼一样。
’
>>>打印yaml.dump(d3,默认_-flow_-style=false,默认_-style='124;')
-“绿色”:
“输入”:
-“港口事件”:
“小部件帮助”:。|-
选择文件名
“widget提示”:。|-
文件名
-“端口目标路径”:
“值”:。|-
事情
“widget提示”:。|-
路径
“输出”:
-“端口值”:
“widget提示”:。|-
一串
“文本”:。|
我迷路了,我找到了
我像狼一样饿。
理想情况下,我希望“短字符串”不使用引号,就像第一个结果一样。但我希望将多行字符串写为块,就像第二个结果一样。我想从根本上说,我正在尽量减少文件中不必要的引号的爆炸,我认为在文本编辑器中进行编辑会让人更加恼火。
有人对此有经验吗?
最佳答案
如果您可以使用(免责声明:我是此增强版pyyaml的作者),您可以执行以下操作:
import ruamel.yaml
yaml_str = """\
- color green :
inputs :
- port thing :
widget-hint : filename
widget-help : Select a filename
- port target_path :
widget-hint : path
value : 'thing'
outputs:
- port value:
widget-hint : string
text : |
I'm lost and I'm found
and I'm hungry like the wolf.
"""
data = ruamel.yaml.round_trip_load(yaml_str)
res = ""
for line in ruamel.yaml.round_trip_dump(data, indent=5, block_seq_indent=3).splitlines(True):
res += line[3:]
print(res)
你会得到:
- color green:
inputs:
- port thing:
widget-hint: filename
widget-help: Select a filename
- port target_path:
widget-hint: path
value: thing
outputs:
- port value:
widget-hint: string
text: |
I'm lost and I'm found
and I'm hungry like the wolf.
不完全是你刚开始做的(但在这次往返之后,它是稳定的)。对于Ruamel.yaml的最新版本,您可以在该缩进中设置序列的缩进和相对缩进。但是,后者也会影响您的顶级序列,因此会影响后期处理。
重要的(对我而言)是保留的:注释、锚定、映射合并和文本标量(使用
-
的多行)关于python - 与pyyaml相当的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24418449/