2011-07-25 45 views
8

我想解析YAML文件,如下面的加載文檔作爲YAML原始字符串與PyYAML

meta-info-1: val1 
meta-info-2: val2 

--- 

Plain text/markdown content! 
jhaha 

如果我load_all這與PyYAML,我得到以下

>>> list(yaml.load_all(open('index.yml'))) 
[{'meta-info-1': 'val1', 'meta-info-2': 'val2'}, 'Plain text/markdown content! jhaha'] 

我試圖在這裏實現的是yaml文件應該包含兩個文檔,第二個文檔應該被解釋爲單個字符串文檔,更具體地說是任何大量帶有降格格式的文本。我不希望它被解析爲YAML語法。

在上例中,PyYAML將第二個文檔作爲單個字符串返回。但是,如果第二個文檔具有:字符而不是!,則會出現語法錯誤。這是因爲PyYAML正在解析該文檔中的內容。

有沒有一種方法可以告訴PyYAML第二個文檔只是一個原始字符串,而不是解析它?

編輯:有一些很好的答案。儘管使用引號或文字語法解決了上述問題,但我希望用戶能夠在不添加任何額外的內容的情況下編寫純文本。只有三個-(或.'s)並且寫下了大量純文本。其中也可能包括引號。所以,我想知道我是否可以告訴PyYAML只解析一個文檔,並將第二個文檔給我。

Eidt 2:那麼,調整AGF的想法,而不是使用try /除第二文檔可以是有效的YAML語法,

config_content, body_content = open(filename).read().split('\n---') 
config = yaml.loads(config_content) 
body = yaml.loads(body_content) 

感謝AGF。

+1

您的文檔無效YAML –

+0

我知道。我不打算在第二份文件中寫出有效的yaml。我希望它作爲一個原始的字符串內容閱讀,解析爲yaml。 –

回答

5

你可以做

raw = open(filename).read() 
docs = [] 
for raw_doc in raw.split('\n---'): 
    try: 
     docs.append(yaml.load(raw_doc)) 
    except SyntaxError: 
     docs.append(raw_doc) 

如果你沒有對原始文檔的格式控制。

從PyYAML文檔,

雙引號是最強大的風格和可以表達任何標量值的僅風格。雙引號標量允許轉義。使用轉義序列\ x **和\ u ****,您可以表達任何ASCII或Unicode字符。

所以這聽起來像是沒有辦法在解析中表示任意標量,如果它不是雙引號。

+0

是的,我曾想到這一點,但我的一些部分是不是很高興這個看似*哈克*解決方案:) –

+0

http: //pyyaml.org/wiki/PYYAMLDocumentation可能有一個真正的解決方案,但快速掃描和搜索不會向我顯示它。 – agf

+0

是的,我在這裏問了兩個小時,然後問這裏:) –

2

如果您只想在YAML中轉義冒號字符,請將其放在單引號或雙引號之內。另外,你可以嘗試literal style作爲你的第二個文檔,應該被視爲單個標量。

+0

嗨Senthil,請看我的更新。順便說一句,我想我曾經在班加羅爾PyCon見過你。是你嗎? ;) –

+0

嗨Shrikant,是的,那就是我。 :)很高興在SO見到你。順便說一句,回到你的問題,我會做一個有條件的YAML負載取決於部分,或重載YAML負載類。第一種解決方案(有條件加載)似乎更容易。 –

+0

感覺一樣:)。你能解釋更多*有條件加載*方法嗎?我不認爲我完全明白。 –