转义单引号时遇到问题
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
的含义相同。忘了引号吧。
在使用 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
的含义相同。忘了引号吧。