在转义单引号时遇到问题

时间:2019-05-21 11:36:06

标签: python yaml ruamel.yaml

使用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)

使用此代码,我总是在插入值的no之前/之后得到前导或尾随空格。

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

如何插入没有值的单引号但没有尾随/标题空间?

3 个答案:

答案 0 :(得分:2)

我不确定我是否完全理解您的要求,但是您只插入了3个字符串作为值并将其串联。在

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

'' 'no'' '部分翻译为''=<Empty String> 'no'=no ' '=<Space>

因此,如果您想要常规'no',请执行以下操作:

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

答案 1 :(得分:0)

如果您可以尝试:

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

它将给您:

'no '

您所做的是将字符串''与字符串'no'并置, 字符串' ',Python在调用'no '之前将其连接到print。你什么 正在尝试做的是使用YAML单引号标量转义机制 在Python中,只有在您从YAML YAML().load()字符串中才能使用。

如果您要在输出中使用单引号标量,就像 在输入中,应使标量与所得到的类型相同 使用.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

答案 2 :(得分:0)

更新:@Anthon通知我,较早版本的YAML会考虑'否'视为不同的值。成为布尔值。因此,请仅将我下面所说的适用于当前版本的YAML。此外,除了编写YAML之外,也许还有其他动机会从最新的解析器中产生特定的结果。在这种情况下,您可以从@Anthon那里得到一个很好的答案,即如何通过不能考虑较旧YAML格式的编写器将这些引号强制输入到生成的YAML中(建议您确保不存在这样的问题)模式)。

YAML旨在传达具有字典,列表和值的特定数据结构。解析YAML时,您所关心的就是生成的数据结构。如果两个YAML文件不同但产生相同的数据结构,那么这些差异对您来说就无关紧要。

在这里,我不确定OP想要什么。似乎他要么希望单词 no 在他的YAML表示的数据结构中出现几次,要么他希望'no'作为该值最终出现在数据结构中。这是在YAML 1.2中编写每种方法的最简洁的方法:

  

== no

     

'否' == "'no'"

在这种情况下,在任何情况下都不会以OP试图强制使用的方式在YAML中显示字符'no'。所有这些额外的代码都试图在不需要时将这些字符强制放入YAML中。该构造与no的含义相同。忘了引用吧。