質問

したいループまでのヒットのファイルのようなオブジェクトのがんの発見"を明文について教えてください"は、私の疑い眺めないはずである。:-)

私はストリーム(この場合、このStringIOオブジェクトが、私は約一般の場合もある店舗は、未知数の記録"<length><data>"形式の例:

data = StringIO("\x07\x00\x00\x00foobar\x00\x04\x00\x00\x00baz\x00")

現在、などの設備を導入し、試作から本当に嬉しかったで読むことは何だと思いど)に初期化されたループのう少し国連Pythonic:

len_name = data.read(4)

while len_name != "":
    len_name = struct.unpack("<I", len_name)[0]
    names.append(data.read(len_name))

    len_name = data.read(4)

C-言語だわる read(4)while's"試験条項があることに対して機能しています。他の考え方を達成。

他のヒント

私はすでに述べた反復子ベースのソリューションは、forループの中にこれを有効にすることを好みます。直接書き込ま別の解決策は、Knuthの「ループ半」です。

while 1:
    len_name = data.read(4)
    if not len_name:
        break
    names.append(data.read(len_name))

あなたはそれが簡単に独自のジェネレータに掲揚し、forループとして使われていますどのように比較することによって見ることができます。

PythonでEOFマーカーは、あなたが持っているものので、空の文字列はイテレータでこれをラップする関数を記述することなく、あなたが得ようとしている最高にかなり近いです。私は同じようwhileを変更することで、もう少し神託のように書くことができます:

while len_name:
    len_name = struct.unpack("<I", len_name)[0]
    names.append(data.read(len_name))
    len_name = data.read(4)

私は読みやすさのための機能とイテレータ再Tendayiの提案で行くと思います:

def read4():
    len_name = data.read(4)
    if len_name:
        len_name = struct.unpack("<I", len_name)[0]
        return data.read(len_name)
    else:
        raise StopIteration

for d in iter(read4, ''):
    names.append(d)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top