对带有注释的 YAML 文件进行排序

Саш*_*ных 5 yaml pyyaml ruamel.yaml

一、总结

\n\n

我找不到如何使用注释对 YAML 文件进行排序。

\n\n

我能找到的解决方案:

\n\n
    \n
  1. 删除评论,

    \n\n

    或者

  2. \n
  3. 不要在右行之后保存注释。

  4. \n
\n\n
\n\n

2. 示例

\n\n

我有一个文件SashaSort.yaml

\n\n
sasha: great\n# Kristina comment\nkristina: legendary\nkatya: \'\xd0\x92\xd0\xb5\xd1\x87\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xbf\xd0\xb0\xd0\xbc\xd1\x8f\xd1\x82\xd1\x8c\'\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

3. 预期行为

\n\n
katya: \'\xd0\x92\xd0\xb5\xd1\x87\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xbf\xd0\xb0\xd0\xbc\xd1\x8f\xd1\x82\xd1\x8c\'\n# Kristina comment\nkristina: legendary\nsasha: great\n
Run Code Online (Sandbox Code Playgroud)\n\n

必须保存非 ASCII 符号。)

\n\n
\n\n

4.没有帮助

\n\n
    \n
  1. 这个问题的答案没有按预期保存评论,
  2. \n
  3. yml-sorterPyYAML删除注释,
  4. \n
  5. 如果我使用i18n_yaml_sorter,我会得到输出:

    \n\n
    katya: \'\xd0\x92\xd0\xb5\xd1\x87\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xbf\xd0\xb0\xd0\xbc\xd1\x8f\xd1\x82\xd1\x8c\'\nkristina: legendary\nsasha: great\n# Kristina comment\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    评论保存不在上方kristina: legendary

    \n\n

    写问题毫无用处,因为 i18n_yaml_sorter 中的最后一次提交是在 2011

  6. \n
  7. 我找不到如何对ruamel.yaml文档中的 YAML 进行排序,

  8. \n
  9. 我找不到排序选项ruamel.yaml.cmd
  10. \n
\n

Max*_*lov 0

PyYAML不支持注释。

\n

ruamel.yaml确实支持,但是需要一些排序的努力。关于引用 ruamel.yaml当前行或上面行的注释的要点:

\n
- one # comment to the current line\n# comment to the line above (one)\n- two\n
Run Code Online (Sandbox Code Playgroud)\n

因此,您应该重新组织解析器结果(并学习保留注释的一些技巧)。我创建了一个模块comments_sort.py来简化这个过程。您可以查看演示脚本。至于请求的示例,它将如下所示:

\n
import sys\n\nimport ruamel.yaml\nfrom comments_sort import map_sort_before\n\nyaml = ruamel.yaml.YAML()\n\nyaml_str = """\\\nsasha: great\n# Kristina comment\nkristina: legendary\nkatya: \'\xd0\x92\xd0\xb5\xd1\x87\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xbf\xd0\xb0\xd0\xbc\xd1\x8f\xd1\x82\xd1\x8c\'\n"""\n\nobj = yaml.load(yaml_str)\nsorted_keys = sorted(\n    list(obj.keys()),\n    key=lambda x: x,\n)\nobj_sorted = map_sort_before(obj, sorted_keys)\nyaml.dump(obj_sorted, sys.stdout)\n
Run Code Online (Sandbox Code Playgroud)\n

输出是:

\n
katya: \xd0\x92\xd0\xb5\xd1\x87\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xbf\xd0\xb0\xd0\xbc\xd1\x8f\xd1\x82\xd1\x8c\n# Kristina comment\nkristina: legendary\nsasha: great\n
Run Code Online (Sandbox Code Playgroud)\n

对于反向排序:

\n
katya: \xd0\x92\xd0\xb5\xd1\x87\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xbf\xd0\xb0\xd0\xbc\xd1\x8f\xd1\x82\xd1\x8c\n# Kristina comment\nkristina: legendary\nsasha: great\n
Run Code Online (Sandbox Code Playgroud)\n

输出是:

\n
sasha: great\n# Kristina comment\nkristina: legendary\nkatya: \xd0\x92\xd0\xb5\xd1\x87\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xbf\xd0\xb0\xd0\xbc\xd1\x8f\xd1\x82\xd1\x8c\n
Run Code Online (Sandbox Code Playgroud)\n