我正在尝试使用PyYAML解析YAML翻译文件,但有些键会导致崩溃:
import yaml
t = yaml.load("%users users have connected: %users users have connected")
错误为"expected alphabetic or numeric character, but found ' '"
答案 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
但是你在这里开始使用%
,然后应该跟一个指令。目前只有YAML
和TAG
定义了两个指令,所有其他字符串都是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不接受它,你也必须在这里使用引号。