如何在Python中将折叠的标量转储到YAML(使用ruamel?)

时间:2016-02-16 13:23:50

标签: python yaml

我一直在寻找使用Python以YAML格式转储折叠标量的方法。常见的answer来自用户Anthon,他建议使用他的ruamel Python库。我接受了建议,但我无法弄清楚如何以折叠样式转储长Python字符串值。

在Anthon的回答中,他/她经常使用带有折叠式代表“>”的硬编码字符串这样说明他的观点:

yaml_str = """\
long: >
  Line1
  Line2
  Line3
"""
data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
print(yaml.dump(data, Dumper=yaml.RoundTripDumper))

我不确定如何将该示例转换为我自己的代码,其中我要转储的字符串值不是来自已经包含折叠的表示符的硬编码值,而是来自Django请求(以及它可能来自任何地方,重点是,我不是用“>”手动在我的代码中构造字符串。

我真的打算做点什么:

stringToDumpFolded = "ljasdfl\n\nksajdf\r\n;lak'''sjf"

data = "Key: > \n" + stringToDumpFolded

ruamel.yaml.dump(data, f, Dumper=yaml.RoundTripDumper))

否则,给定一个长的unicode字符串变量,如何使用ruamel将其转储到文件中?

1 个答案:

答案 0 :(得分:1)

从0.15.61开始,可以在ruamel.yaml中来回折叠标量:

import sys
import ruamel.yaml

yaml_str = """\
long: >
  Line1
  Line2
  Line3
"""

yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
print(type(data['long']), data['long'].fold_pos, end='\n-----\n')
yaml.dump(data, sys.stdout)

给出:

<class 'ruamel.yaml.scalarstring.FoldedScalarString'> [5, 11]
-----
long: >
  Line1
  Line2
  Line3

仅显示该类型的打印内容,以显示您如何建立 您自己,从头开始创建什么对象:

from ruamel.yaml.scalarstring import FoldedScalarString as folded

s = folded('Line1 Line2 Line3\n')
data = dict(long=s)
yaml.dump(data, sys.stdout)

它给出了一个折叠的标量,但可能不是您想要的方式:

long: >
  Line1 Line2 Line3

要将此折叠起来,您必须提供.fold_pos属性。那 属性必须是一个列表(或一些可逆的可迭代对象),其位置为 字符串中的空格字符,其中需要插入折叠:

s = folded('Line1 Line2 Line3\n')
s.fold_pos = [5, 11]
data = dict(long=s)
yaml.dump(data, sys.stdout)

返回您期望的输出:

long: >
  Line1
  Line2
  Line3

由于您似乎希望将所有空间都折叠起来,因此还可以执行以下操作:

import re
s.fold_pos = [x.start() for x in re.finditer(' ', s)]