使用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
如何插入没有值的单引号但没有尾随/标题空间?
答案 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
的含义相同。忘了引用吧。