转义单引号时遇到问题

Having issues escaping single quote

在使用 ruamel.yaml.

向 yaml 添加新值时,我很难转义单引号

下面是我正在做的

import sys
from ruamel.yaml import YAML

yaml_doc = """\
Mappings:
  Values:
    '123': 'no'
"""

yaml = YAML()
yaml.preserve_quotes = True
data = yaml.load(yaml_doc)

new_value = data['Mappings']['Values']
new_value.insert(len(new_value), '456','' 'no'' ', comment="New Value")
new_value.insert(len(new_value), '789',' ''no' '', comment="New Value 2")
yaml.dump(data, sys.stdout)

使用此代码,对于我插入的值,我总是得到一个前导或尾随 space after/before 否。

Mappings:
  Values:
    '123': 'no'
    '456': 'no '  # New Value
    '789': ' no' # New Value 2

如何插入带有单引号但没有 trailing/heading space 的无值?

我不确定我是否完全理解您的问题,但您只是为该值插入了 3 个字符串并将它们连接起来。在

new_value.insert(len(new_value), '456','' 'no'' ', comment="New Value")

'' 'no'' ' 部分转换为 ''=<Empty String> 'no'=no ' '=<Space>

所以如果你想要一个 regurlar 'no' 就这样做:

new_value.insert(len(new_value), '456','no', comment="New Value")

如果你愿意尝试:

print(repr('' 'no'' '))

它会给你:

'no '

因为你所做的是将字符串 '' 与字符串 'no' 并列 字符串 ' ',Python 在调用 print 之前连接到 'no '。你什么 正在尝试做的是使用 YAML 单引号标量转义机制 在 Python 中,只有当你 YAML().load() 来自 YAML 的字符串时才有效。

如果你想在输出中使用单引号标量,就像你 在您的输入中,您应该使标量与您得到的类型相同 使用 .load()。那是 ruamel.yaml.scalarstring.SingleQuotedScalarString(如 string 子类)。

import sys
from ruamel.yaml import YAML
from ruamel.yaml.scalarstring import SingleQuotedScalarString as sq

yaml_doc = """\
Mappings:
  Values:
    '123': 'no'
"""

yaml = YAML()
yaml.preserve_quotes = True
data = yaml.load(yaml_doc)

new_value = data['Mappings']['Values']
new_value['456'] = sq('no')
new_value.yaml_add_eol_comment(comment="New Value", key='456', column=0)
new_value.insert(len(new_value), '789', sq('no'), comment="New Value 2")
yaml.dump(data, sys.stdout)

这给出:

Mappings:
  Values:
    '123': 'no'
    '456': 'no' # New Value
    '789': 'no' # New Value 2

更新:@Anthon 告诉我早期版本的 YAML 会将 no'no' 视为不同的值,将 no 视为布尔值。所以请只把我下面所说的适用于当前版本的 YAML。此外,除了编写 YAML 之外,这里可能还有另一个动机,它会从最新的解析器中产生特定的结果。在这种情况下,@Anthon 在上面给出了一个很好的答案,关于如何通过无法考虑旧 YAML 格式的编写器将这些引号强制到生成的 YAML 中(我建议确保没有这样的作者模式)。

YAML 是关于传递特定的数据结构,包括字典、列表和值。解析 YAML 时,您只关心生成的数据结构。如果两个 YAML 文件不同但产生相同的数据结构,则差异对您来说无关紧要。

在这里,我不确定 OP 想要什么。看起来他要么想要 no 这个词在他的 YAML 表示的数据结构中出现几次,要么他想要 'no' 是最终出现在数据结构中的值。以下是最简洁的编写方式(在 YAML 1.2 中):

no == no

'no' == "'no'"

这里没有字符 'no' 需要以 OP 试图强制的方式出现在 YAML 中的情况。所有这些额外的代码都试图在没有必要的时候将这些字符强加到 YAML 中。该构造与 no 的含义相同。忘了引号吧。