0

ファイルを開き、「myfile」という名前を付けました。それから2つの異なる辞書を作成したいのですが、ファイルが閉じてしまい、最初のループで最初の辞書を作成したためだと思います。ヒストグラムの空の辞書を取得します。myfile を x として使用し、2 番目のループで f の代わりに x を使用しようとしましたが、この「ValueError: 閉じたファイルの I/O 操作」が発生します。

また、それが違いを生む場合、クラスの関数でこれを行っています。

これを機能させる方法を知っている人はいますか?

    d = {}
    d2 ={}
    with myfile as f:
        next(f)
        for line in f:
            k, v = line.split()
            d[int(k)] = int(v)
            next(f)

        for line in f:
            items = line.split()
            key, values = int(items[0]), items[1:]
            d2.setdefault(key, []).extend(values)


    hist = defaultdict(list)
    for key, values in d2.iteritems():
        hist[len(values)].append(key)
    histogram = dict(hist)
4

3 に答える 3

4

最初にループしてイテレータを使い果たしているだけです。したがって、もう一度ループしようとすると、何も表示されなくなります。

すべてのロジックを同じループに入れるだけです。あなたのループが何をしているのかよくわかりませんが、最初のループのように見えますenumerate. 2 番目のループはすべての行に適用されるように見えるので、そのループから始めて、「最初の」ループの機能をそれに追加します。このようなもの:

with myfile as f: # Better:  with open('/some/file.txt', 'rb') as f:
    for i, line in enumerate(f):
        # "Second" loop
        items = line.split()
        key, values = int(items[0]), items[1:]
        d2.setdefault(key, []).extend(values)

        # "First" loop
        if i % 2 != 0: # Only process odd-numbered lines
            k, v = items
            d[int(k)] = int(v)
于 2013-10-28T21:14:59.873 に答える
2

あなたが尋ねた質問を解決するにはf.seek(0)、最初のループの後に呼び出します

ただし、データを 1 回だけループするという @henry-keiter の推奨事項は、真剣に受け止める必要があります。

于 2013-10-28T21:16:56.253 に答える