2016-03-25 36 views
1

我有一個Python程序解析一些YAML文件,其中一些包含註釋,錨點,引用和合並鍵,我想保存當我將YAML文件加載到我的分析器中。 ruamel.yaml似乎有這些往返保存,當我運行以下命令:Ruamel.yaml:如何訪問合併鍵和註釋在加載OrderedDict

with open(yaml_file, "r") as f: 
    yaml = f.read() 
parsed_yaml = ruamel.yaml.load(yaml, ruamel.yaml.RoundTripLoader) 
print ruamel.yaml.dump(parsed_yaml,Dumper=ruamel.yaml.RoundTripDumper) 

打印出原始文件yaml_file,因爲它被提出,包括意見和合並鍵。我想知道如果我可以訪問這些評論和其他鍵,而YAML分析在OrderedDict窗體。我需要將這些YAML文件轉換爲中間類型,因此能夠同時處理getset註釋,合併鍵,錨點和引用是高優先級。

回答

1

是的,你可以訪問,評論等你映射(蟒蛇dict)將在CommentedMap一個實例和您在CommentedSeq實例序列(蟒蛇list)被加載。這些是ordereddictCommentedBase的子類,的listCommentedBase

CommentedBase有幾個屬性,將註釋,合併,錨點和流式樣信息附加到該屬性。它還有幾個方法設置/獲取這些值,這些值依賴於某些映射/序列特定的輔助函數。

import sys 
import ruamel.yaml as yaml 

yaml_str = """\ 
a: 1 # comment 1 
b: 2 
c: 3 
d: 4 
e: 5 
""" 

data = yaml.round_trip_load(yaml_str) 
data.yaml_add_eol_comment('comment 2', key='c') 
data.yaml_add_eol_comment('# comment 3', key='e', column=8) 
yaml.round_trip_dump(data, sys.stdout) 

會給你:

a: 1 # comment 1 
b: 2 
c: 3 # comment 2 
d: 4 
e: 5 # comment 3 

請注意:

  • 如果不指定起始列,下一個上一個註釋的列取。
  • 前導#如果註釋字符串尚未以該字符組合開始,則會插入空格。
  • 標量和註釋之間至少有一個空格。

界面沒有記錄,主要是因爲圖書館作者的懶惰。你最好看看tests for commentsanchors來得到一些例子。該界面還將需要對屬性內容級別進行一些改變,例如允許將EOL註釋附加到鍵以及鍵+值組合。下面YAML並不往返正如你所期望/正確:

abc:  # this is the key 
    9989 # this is the value 

所以一定要包你需要這樣有一個點,你可以修改的功能,如果在一ruamel.yaml變化的界面向後不兼容的方式。