3

入力ストリームを入力として受け取るメソッド (.yml パーサー) があります。問題は、特定の場所で特定の文字に遭遇するとエラーがスローされること%です。

私がやりたいことは、ストリームを取得し、すべてを%プレースホルダーに置き換えてから、パーサーに渡すことです。

これは私が持っているものです(現在の入力では機能しません):

    stream = open('file.yml', 'r')
    dict = yaml.safe_load(stream)

しかし、私が必要だと思うのは次のようなものです:

    stream = open('file.yml', 'r')
    temp_string = stringFromString(stream)     #convert stream to string
    temp_string.replace('%', '_PLACEHOLDER_')  #replace with place holder
    stream = streamFromString(temp_String)     #conver back to stream
    dict = yaml.safe_load(stream)
4

1 に答える 1

6

編集:明らかに、ここでの元の回答は機能しなくなったようで、ライブラリにはファイルのようなオブジェクトが必要になりました。

それを考えると、少し厄介になります。ファイルのような方法で動作する独自のラッパーを作成することもできます (これの基本はおそらくio.TextIOBase) であり、バッファー内で置換を行いますが、怠惰を犠牲にしても構わないと思っている場合、最も簡単な解決策は、最初に提案されたものです。質問:メモリ内で置換を行います。

文字列をファイルのようなオブジェクトに変換するソリューションはio.StringIO.


古い答え:

これを行う良い方法は、ジェネレーターを作成することです。そのようにすると、遅延したままになります (ファイル全体を一度に読み込む必要はありません)。

def replace_iter(iterable, search, replace):
    for value in iterable:
        value.replace(search, replace)
        yield value

with open("file.yml", "r") as file:
    iterable = replace_iter(file, "%", "_PLACEHOLDER")
    dictionary = yaml.safe_load(iterable)

ファイルを開くためのステートメントの使用に注意してください。withこれは、例外が発生した場合でもファイルが適切に閉じられるようにするため、Python でファイルを開くための最良の方法です。

dictまた、組み込みを破壊して使用できなくなるため、変数名が不適切であることに注意してくださいdict()

stringFromStream()関数は本質的に でありfile.read()、 であることに注意してください。「ストリーム」と呼んでいるものは、実際には文字列 (ファイルの行) に対する単なるイテレータです。steamFromString()data.splitlines()

于 2013-01-18T14:34:31.353 に答える