Python 使用pyyaml的漂亮输出

Python 使用pyyaml的漂亮输出,python,yaml,pretty-print,pyyaml,Python,Yaml,Pretty Print,Pyyaml,我有一个python项目,我想在其中使用YAML(PyYAML3.11),特别是因为它“漂亮”,用户可以在必要时在文本编辑器中轻松编辑。不过,我的问题是,如果我将YAML引入python应用程序(我将需要这样做)并编辑内容(我将需要这样做),那么编写新文档通常不像我开始时那样漂亮 pyyaml文档非常糟糕——甚至没有将参数记录到dump函数中。我找到了。然而,我仍然缺少我需要的信息。(我开始研究源代码,但它似乎不是最吸引人的。如果我没有在这里找到解决方案,那么这是我唯一的办法。) 我从一个如下所

我有一个python项目,我想在其中使用YAML(PyYAML3.11),特别是因为它“漂亮”,用户可以在必要时在文本编辑器中轻松编辑。不过,我的问题是,如果我将YAML引入python应用程序(我将需要这样做)并编辑内容(我将需要这样做),那么编写新文档通常不像我开始时那样漂亮

pyyaml文档非常糟糕——甚至没有将参数记录到dump函数中。我找到了。然而,我仍然缺少我需要的信息。(我开始研究源代码,但它似乎不是最吸引人的。如果我没有在这里找到解决方案,那么这是我唯一的办法。)

我从一个如下所示的文档开始:

- 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. -绿色: 投入: -港口事件: 小部件提示:文件名 小部件帮助:选择文件名 -端口目标路径: 小部件提示:路径 价值:“东西” 产出: -端口值: 小部件提示:字符串 正文:| 我迷路了,我找到了 我像狼一样饿。 在加载到python(yaml.safe_load)中之后,我尝试了几种方法将其转储:

>>> print yaml.dump( d3, default_flow_style=False, default_style='' ) - color green: inputs: - port thing: widget-help: Select a filename widget-hint: filename - port target_path: value: thing widget-hint: path outputs: - port value: widget-hint: string text: 'I''m lost and I''m found and I''m hungry like the wolf. ' >>>打印yaml.dump(d3,默认流量样式=False,默认样式=“”) -绿色: 投入: -港口事件: 小部件帮助:选择文件名 小部件提示:文件名 -端口目标路径: 价值:东西 小部件提示:路径 产出: -端口值: 小部件提示:字符串 文字:“我迷路了,我找到了。” 我饿得像狼一样。 ' >>>打印yaml.dump(d3,默认_flow_style=False,默认_style='|') -“绿色”: “投入”: -“港口事件”: “小部件帮助”:|- 选择一个文件名 “小部件提示”:|- 文件名 -“端口目标路径”: “价值”:|- 事情 “小部件提示”:|- 路径 “产出”: -“端口值”: “小部件提示”:|- 一串 “文本”:| 我迷路了,我找到了 我像狼一样饿。 理想情况下,我希望“短字符串”不要像第一个结果那样使用引号。但我希望多行字符串被写成块,就像第二个结果一样。我想,从根本上说,我是在尽量减少文件中不必要的引号的爆炸,我认为这会使在文本编辑器中编辑变得更加烦人

有人有这方面的经验吗?

试试漂亮的打印机。它越来越近了,尽管它确实在短字符串周围加了引号,其中有空格:

>>> print pyaml.dump(d3)
- 'color green':
    inputs:
      - 'port thing':
          widget-help: 'Select a filename'
          widget-hint: filename
      - 'port target_path':
          value: thing
          widget-hint: path
    outputs:
      - 'port value':
          widget-hint: string
    text: |
      I'm lost and I'm found
      and I'm hungry like the wolf.
如果您可以使用(免责声明:我是这个增强版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的最新版本,您可以在该缩进中设置序列的缩进和相对缩进。但是,后者也会影响顶级序列,从而影响后期处理


重要的(对我来说)保留的东西:注释、锚、映射合并和文字标量(多行使用
|

@AndySmith Ok。让我们删除这些注释,因为它们对任何人都没有帮助。在ruamel.yaml中指定多行字符串应作为块(使用
|
)编写,短字符串不应接收引号,而还没有一个yaml文件来调用@oulenz的往返,这取决于您对easy的定义,当然,如果您不想手动使用这些规则,您必须拥有一些规则(例如,任何包含换行符的字符串都应该是文本块标量;任何不带空格的字符串都应该是无引号的)。如果你有兴趣的话,为什么不在这里问一个关于这个的问题呢?我现在正在使用。我曾希望你可能已经包括了一个选项,因为这似乎是许多人想要的。我对各种边缘案例不太熟悉,无法理解这一点。@oulenz我的答案可能需要一些更新。如果其他人阅读此评论并徒劳地试图找到
yaml.dump()
pretty\u print
选项,。。。此注释指的是不太标准的
pyaml
包(使用
import pyaml
导入),而不是更标准的PyYAML(使用
import yaml
导入)。
- 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.