一些关键字符串(如“%something”)使PyYAML解析器崩溃

时间:2013-04-22 16:23:40

标签: python pyyaml

我正在尝试使用PyYAML解析YAML翻译文件,但有些键会导致崩溃:

import yaml
t = yaml.load("%users users have connected: %users users have connected")

错误为"expected alphabetic or numeric character, but found ' '"

2 个答案:

答案 0 :(得分:0)

Python built-in types documentation.

上搜索'%u'

%u是一个过时的字符串插值代码,与%d相同。 Python认为你正在尝试插入一个字符串。如果要将其更改为:

,它应该正确解析
t = yaml.load("%users users have connected: %users users have connected" % users)

但它仍然不会给你你可能期望的东西,因为结果字符串将是:

10sers users have connected: 10sers users have connected

您可以转义'%'字符,或将翻译键包装在大括号中并使用字符串格式,如下所示:

d = {"users": 10}
t = yaml.load("\{users\} users have connected: \{users\} users have connected")

print t.replace('\\','').format(**d)
>>> '10 users'

正如评论中所提到的,你可以通过使用以下方式转义'%'来将其变成一个没有投诉的字符串:

t = yaml.load(s.replace('%', '\%')).replace('\%', '%')

其中's'是翻译文件中的字符串。

答案 1 :(得分:0)

我没有得到同样的错误,PyYAML 3.11和Python2.7.10给出了:

yaml.parser.ParserError: expected '<document start>', but found '<stream end>'
  in "<string>", line 1, column 57:
     ... ted: %users users have connected

但是你在这里开始使用%,然后应该跟一个指令。目前只有YAMLTAG定义了两个指令,所有其他字符串都是reserved for future use

YAML规范states

  

裸文档不以任何指令或标记行开头。这些文件非常“干净”,因为它们只包含内容。在这种情况下,第一个非注释行可能不会以“%”第一个字符开头。

这实际上意味着字符串%users users have connected: %users users have connected是不正确的YAML,如果这是标量,则必须将其放在引号中。但是我希望以下是正确的YAML:

- %users users have connected: %users users have connected

但是PyYAML不接受它,你也必须在这里使用引号。