将字典附加到字典列表会在关键字周围添加双引号

时间:2017-02-08 23:01:49

标签: python json dictionary yaml robotframework

我想完成:
将词典附加到现有词典列表并更新该词典中的值。

我的问题是: 当我从.yaml RobotFramework中读取我的词典时,会在关键字和值周围添加双重qoutes,如下所示。

在.yaml我有

Vlan2: { u'IP': u'1.1.1.1', 
         u'DNS': {u'SN': u's2', u'PN': u's1'}, 
         u'SRoute': [{u'IF': u'eth0', u'Mask': u'0.0.0.0'}]
       }

但是当我做的时候

Collections.Set To Dictionary  ${Vlan2}  IP=2.2.2.2

我登录到控制台

Log To Console  ${Vlan2}

我得到了

[{ "u'IP'": "u'1.1.1.1'", 
   u'IP': '2.2.2.2', 
   "u'DNS'": {"u'SN'": "u's2'", "u'PN'": "u's1'"}, 
   "u'SRoute'": [{"u'IF'": "u'eth0'", "u'Mask'": "u'0.0.0.0'"}]
 }]

我认为这种情况正在发生,因为Robot Framework在从.yaml中读取值时会添加双qoutes,因为它会显示为不同的关键字,但我无法找到解决方法。

理想的是避免双重qoutes,因为JSON信息将基于单个qoute,如.yaml。

感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

这里有很多混乱。这部分你的YAML:

{ u'IP': u'1.1.1.1', 

启动映射({)并提供键值对。关键和价值都是标量。第一个标量以u开头,在关键指标(:)之前结束,因此标量的内容为u'IP'。请注意,这可能不是您想要的,因为您说:

  

因为JSON信息将基于单个qoute,如.yaml。

您似乎认为您在YAML中使用单引号标量,而事实上,您正在使用未加引号的标量。在YAML中,如果标量不以引号('")开头,则它是一个普通标量,其中的其他引号将被解析为内容。你的标量以u开头,使它们成为不带引号的标量。你的YAML应该是这样的:

Vlan2: { IP: 1.1.1.1, 
         DNS: {SN: s2, PN: s1}, 
         SRoute: [{IF: eth0, Mask: 0.0.0.0}]
       }

另一个要记住的重要事项是,当加载到Python中时,标量的表示形式会丢失 - 如果它在YAML文件中是单引号,双引号或不引用,则没有区别。

现在让我们看看输出:这里再次,字符串以文本形式表示。这意味着它们通过某种方式引用。表示"u'IP'"完全匹配您的输入,双引号添加到字符串中;它们只是用来告诉你所包含的字符形成一个字符串。

然后在输出中有这种表示:u'IP'。这仍然是一个带引号的字符串,只是在前面有一个u的Python特定表示,表明这是一个unicode字符串 - 它的内容是IP YAML中不存在u - 前缀表示,这就是您的输入无法正常工作的原因。在YAML中,所有输入都是unicode,通常编码为UTF-8。输出中的u'IP'是您使用代码设置的IP值。并且因为它与任何现有的dict键都不匹配(正如您所解释的那样,原始键具有内容u'IP',在输出中表示为"u'IP'"),它已被添加为dict的附加键