ファイル全体を解析するのではなく、必要に応じて入力ファイルを一度に1つのエントリで読み取ることができるPythonのyamlライブラリはありますか?ルートノードとしてリストを含む長いファイルがあります。特定のプロパティを満たす最初の要素を見つけようとしている場合、ファイル全体を読み取って解析する必要がない場合があり、結果をより速く取得できます。
PyYAMLの低レベルparse()
APIを使用できます。
import yaml
for event in yaml.parse(input):
# process event
ルートレベルシーケンスの各アイテムをネイティブPython値に構築する場合は、Composer
およびConstructor
クラスを使用する必要があります。Composer
イベントを読み取って、に変換し、ノード、Constructor
からPythonの値を構築するノードが。これは、YAML仕様で定義されている読み込みプロセスに対応しています。
今PyYAMLとのComposer
を期待する機能get_event
、check_event
およびpeek_event
上に存在するself
が、それらを実装していません。それらはによって実装されParser
ます。したがって、YAMLローディングチェーンを機能させるために、PyYAMLは後で次のことを行います。
class Loader(Reader, Scanner, Parser, Composer, Constructor, Resolver):
def __init__(self, stream):
Reader.__init__(self, stream)
Scanner.__init__(self)
Parser.__init__(self)
Composer.__init__(self)
Constructor.__init__(self)
Resolver.__init__(self)
これは、Loader
オブジェクトが必要であり、Parser
トップレベルのイベントにAPIを使用し、Composer
およびConstructor
APIを使用してトップレベルのシーケンスで各アイテムをロードすることを意味します。
始めるためのコードは次のとおりです。
import yaml
input = """
- "A": 1
- "B": 2
- foo
- 1
"""
loader = yaml.SafeLoader(input)
# check proper stream start (should never fail)
assert loader.check_event(yaml.StreamStartEvent)
loader.get_event()
assert loader.check_event(yaml.DocumentStartEvent)
loader.get_event()
# assume the root element is a sequence
assert loader.check_event(yaml.SequenceStartEvent)
loader.get_event()
# now while the next event does not end the sequence, process each item
while not loader.check_event(yaml.SequenceEndEvent):
# compose current item to a node as if it was the root node
node = loader.compose_node(None, None)
# construct a native Python value with the node.
# we set deep=True for complete processing of all the node's children
value = loader.construct_object(node, True)
print(value)
# assume document ends and no further documents are in stream
loader.get_event()
assert loader.check_event(yaml.DocumentEndEvent)
loader.get_event()
assert loader.check_event(yaml.StreamEndEvent)
YAMLドキュメントにアンカーとエイリアスがあると、問題が発生する可能性があることに注意してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加