gpt4 book ai didi

python - 保留引号并在 Ruamel 中添加带引号的数据

转载 作者:太空狗 更新时间:2023-10-29 22:12:42 24 4
gpt4 key购买 nike

我正在使用 Ruamel 来保留人工编辑的 YAML 文件中的引用样式。

我有示例输入数据:

---
a: '1'
b: "2"
c: 3

我使用以下方式读入数据:

def read_file(f):
with open(f, 'r') as _f:
return ruamel.yaml.round_trip_load(_f.read(), preserve_quotes=True)

然后我编辑该数据:

data = read_file('in.yaml')
data['foo'] = 'bar'

我写回磁盘使用:

def write_file(f, data):
with open(f, 'w') as _f:
_f.write(ruamel.yaml.dump(data, Dumper=ruamel.yaml.RoundTripDumper, width=1024))

write_file('out.yaml', data)

输出文件是:

a: '1'
b: "2"
c: 3
foo: bar

有没有一种方法可以强制对字符串 'bar' 进行硬引用,而无需在文件的其余部分强制执行该引用样式?

(另外,我可以阻止它删除三个破折号 --- 吗?)

最佳答案

为了保留字符串标量的引号(和文字 block 样式),ruamel.yaml¹——在往返模式中——将这些标量表示为 SingleQuotedScalarStringDoubleQuotedScalarStringPreservedScalarString。这些非常薄的包装器的类定义可以在 scalarstring.py 中找到。当序列化这些实例时,它们是“按读取的方式”编写的,尽管有时当事情变得困难时,表示器会退回到双引号,因为它可以表示任何字符串。

要在添加新键值对(或更新现有键值对时)时获得此行为,您只需自己创建这些实例:

import sys
from ruamel.yaml import YAML
from ruamel.yaml.scalarstring import SingleQuotedScalarString, DoubleQuotedScalarString

yaml_str = """\
---
a: '1'
b: "2"
c: 3
"""

yaml = YAML()
yaml.preserve_quotes = True
yaml.explicit_start = True
data = yaml.load(yaml_str)
data['foo'] = SingleQuotedScalarString('bar')
data.yaml_add_eol_comment('# <- single quotes added', 'foo', column=20)
yaml.dump(data, sys.stdout)

给出:

---
a: '1'
b: "2"
c: 3
foo: 'bar' # <- single quotes added

yaml.explicit_start = True 重新创建(多余的)文档开始标记。顶级字典对象“不知道”这样的标记是否在原始文件中,因此您必须手动重新添加它。

请注意,如果没有 preserve_quotes,值 12 无论如何都会有(单)引号,以确保它们被看到作为字符串标量而不是整数。


¹ 我是其中的作者。

关于python - 保留引号并在 Ruamel 中添加带引号的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39262556/

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