python - 如何从 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?
解决方案
与其说是缩进,不如说是序列项指示符的偏移量。这个偏移量取自项目之前的空间,如果根节点是一个列表,这会给出正确的 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
当然,如果一开始就不会产生额外的行首空格,效率会更高。
推荐阅读
- c++ - 在 C++ 中作为循环的一部分读取文件名
- mongodb - 如何在mongo聚合不起作用的情况下将字符串转换为日期总是返回null?
- node.js - 从 DocuSign getAgreementPdf 获得结业证书的任何方式
- r - 压缩数据表列中的重复条目 (R)
- python - 如何在python海龟游戏中加载不同的关卡
- javascript - 通过Javascript读取Object的属性
- reactjs - Reactjs:TypeError:无法使用脚本为范围注册ServiceWorker:获取脚本时收到错误的HTTP响应代码(404)
- android - Android Camera2 高速捕捉,焦点改变
- perl - Perl 5.32.1 GDBM_File 非常慢
- chatbot - 无法使用 Botium CLI 从 QnAMaker 导入 convos 和话语