首页 > 解决方案 > 如何从 ruamel.yaml 转储的输出中删除 2 个空格?

问题描述

yaml.indent(sequence=4, offset=2)的帮助下,输出是正确的,但每一行都有额外的空间,我知道这是由于上述缩进功能。有什么方法可以从每行中删除 2 个额外的空格(我不会使用 strip())。

代码:

import sys
import ruamel.yaml

data = [{'item': 'Food_eat', 'Food': {'foodNo': 42536216,'type': 'fruit','moreInfo': ['organic']}}]

yaml = ruamel.yaml.YAML()
yaml.indent(sequence=4, offset=2)
yaml.dump(data, sys.stdout)

上述代码的输出:

  - item: Food_eat
    Food:
      foodNo: 42536216
      type: fruit
      moreInfo:
        - organic

所需输出:

- item: Food_eat
  Food:
    foodNo: 42536216
    type: fruit
    moreInfo:
      - organic

PS:我从这个 stackoverflow 问题中得到了帮助: How to safe_dump the dictionary and list into YAML?

标签: pythonpython-3.xyamlruamel.yaml

解决方案


与其说是缩进,不如说是序列项指示符的偏移量。这个偏移量取自项目之前的空间,如果根节点是一个列表,这会给出正确的 YAML,但它看起来不是最优的。

我一直在寻找解决这个问题,但没有想出一个好的解决方案。在我这样做之前,您必须对输出进行后处理,这很容易完成:

import sys
import ruamel.yaml

data = [{'item': 'Food_eat', 'Food': {'foodNo': 42536216,'type': 'fruit','moreInfo': ['organic']}}]

def strip_leading_double_space(stream):
    if stream.startswith("  "):
        stream = stream[2:]
    return stream.replace("\n  ", "\n")
    # you could also do that on a line by line basis
    # return "".join([s[2:] if s.startswith("  ") else s for s in stream.splitlines(True)])


yaml = ruamel.yaml.YAML()
yaml.indent(sequence=4, offset=2)
print('# < to show alignment')
yaml.dump(data, sys.stdout, transform=strip_leading_double_space)

这使:

# < to show alignment
- item: Food_eat
  Food:
    foodNo: 42536216
    type: fruit
    moreInfo:
      - organic

当然,如果一开始就不会产生额外的行首空格,效率会更高。


推荐阅读