26

YAMLデータからドキュメントジェネレーターを作成しています。これにより、各アイテムが生成されるYAMLファイルの行が指定されます。これを行うための最良の方法は何ですか?したがって、YAMLファイルが次のような場合:

- key1: item 1
  key2: item 2
- key1: another item 1
  key2: another item 2

私はこのようなものが欲しい:

[
     {'__line__': 1, 'key1': 'item 1', 'key2': 'item 2'},
     {'__line__': 3, 'key1': 'another item 1', 'key2': 'another item 2'},
]

現在PyYAMLを使用していますが、Pythonから使用できれば、他のライブラリでも問題ありません。

4

4 に答える 4

14

Composer.compose_nodeとにフックを追加して作成しましたConstructor.construct_mapping

import yaml
from yaml.composer import Composer
from yaml.constructor import Constructor

def main():
    loader = yaml.Loader(open('data.yml').read())
    def compose_node(parent, index):
        # the line number where the previous token has ended (plus empty lines)
        line = loader.line
        node = Composer.compose_node(loader, parent, index)
        node.__line__ = line + 1
        return node
    def construct_mapping(node, deep=False):
        mapping = Constructor.construct_mapping(loader, node, deep=deep)
        mapping['__line__'] = node.__line__
        return mapping
    loader.compose_node = compose_node
    loader.construct_mapping = construct_mapping
    data = loader.get_single_data()
    print(data)
于 2012-11-10T05:24:09.983 に答える
6

ruamel.yaml >= 0.9 (私が作成者) を使用し、 を使用している場合、コレクション アイテムRoundTripLoaderのプロパティにアクセスlcして、ソース YAML で開始した行と列を取得できます。

def test_item_04(self):
    data = load("""
     # testing line and column based on SO
     # http://stackoverflow.com/questions/13319067/
     - key1: item 1
       key2: item 2
     - key3: another item 1
       key4: another item 2
        """)
    assert data[0].lc.line == 2
    assert data[0].lc.col == 2
    assert data[1].lc.line == 4
    assert data[1].lc.col == 2

(行と列は 0 から数え始めます)。

この回答lcは、読み込み中に文字列型に属性を追加する方法を示しています。

于 2015-04-18T17:52:59.670 に答える