2013-04-22 39 views
0

我試圖用PyYAML解析YAML翻譯文件,但有些按鍵使其崩潰:一些關鍵的字符串(如「%的東西」)讓PyYAML解析器崩潰

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

的錯誤是"expected alphabetic or numeric character, but found ' '"

+0

錯誤似乎很清楚,您提供給掃描儀的數據是怎樣的? – 2013-04-22 16:27:45

+0

這個翻譯文件不是來自Python應用程序,它正在工作。解析器引發的錯誤非常乾淨,但我無法更改我應該處理的文件。 – AsTeR 2013-04-22 18:39:00

回答

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' 

正如在評論中提到,你可以把它轉換成字符串無投訴轉義使用 '%' S:

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

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

+0

你讓我改變我的問題不解決它。提供的代碼是對問題的最小程度的重現,我正在加載一些不是來自Python環境的翻譯文件。 – AsTeR 2013-04-23 07:48:30

+0

對不起。我並不清楚實際問題是什麼。它仍然是嘗試插入%u並格式化字符串。我發現將這個字符串變成一個沒有抱怨的變量的唯一方法是:t = yaml.load(s。替換('%','\%'))。replace('\%','%')其中's'是翻譯後的字符串。 – 2013-04-23 17:50:01

+0

我終於在我的輸入文件中引用了我的密鑰,但您的評論看起來不錯,您能否根據這個更新答案? – AsTeR 2013-04-24 10:47:56

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不接受它,你要在這裏使用引號爲好。

相關問題