我試圖用PyYAML解析YAML翻譯文件,但有些按鍵使其崩潰:一些關鍵的字符串(如「%的東西」)讓PyYAML解析器崩潰
import yaml
t = yaml.load("%users users have connected: %users users have connected")
的錯誤是"expected alphabetic or numeric character, but found ' '"
我試圖用PyYAML解析YAML翻譯文件,但有些按鍵使其崩潰:一些關鍵的字符串(如「%的東西」)讓PyYAML解析器崩潰
import yaml
t = yaml.load("%users users have connected: %users users have connected")
的錯誤是"expected alphabetic or numeric character, but found ' '"
在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'
正如在評論中提到,你可以把它轉換成字符串無投訴轉義使用 '%' S:
t = yaml.load(s.replace('%', '\%')).replace('\%', '%')
其中 's' 是從翻譯文件中的字符串。
你讓我改變我的問題不解決它。提供的代碼是對問題的最小程度的重現,我正在加載一些不是來自Python環境的翻譯文件。 – AsTeR 2013-04-23 07:48:30
對不起。我並不清楚實際問題是什麼。它仍然是嘗試插入%u並格式化字符串。我發現將這個字符串變成一個沒有抱怨的變量的唯一方法是:t = yaml.load(s。替換('%','\%'))。replace('\%','%')其中's'是翻譯後的字符串。 – 2013-04-23 17:50:01
我終於在我的輸入文件中引用了我的密鑰,但您的評論看起來不錯,您能否根據這個更新答案? – AsTeR 2013-04-24 10:47:56
我沒有得到同樣的錯誤,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不接受它,你要在這裏使用引號爲好。
錯誤似乎很清楚,您提供給掃描儀的數據是怎樣的? – 2013-04-22 16:27:45
這個翻譯文件不是來自Python應用程序,它正在工作。解析器引發的錯誤非常乾淨,但我無法更改我應該處理的文件。 – AsTeR 2013-04-22 18:39:00