gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:36:30 25 4
gpt4 key购买 nike

我一直在搜索 stackoverflow,寻找一种使用 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 将其转储到文件中?

最佳答案

从 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)]

关于python - 如何在 Python 中将折叠标量转储到 YAML(使用 ruamel?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35433838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com