1

cPickleを使用して辞書オブジェクトをファイルに保存していますが、最初のエントリ以外のエントリを取得できません。最初はファイルtweets.pklが空で、EOFErrorが発生します。私はそれがそれと関係があると確信しています。ありがとう

#!/usr/bin/env python                                                                                                                                        

from urllib import urlencode, urlopen
from simplejson import loads
from hashlib import md5
from collections import defaultdict
import json
import cPickle as pickle

def fetch_tweets(new_feeds):
    dic = json.loads(new_feeds)
    feeds_file = open('tweets.pkl','r+b')
    try:
        feeds = pickle.load(feeds_file)
    except EOFError:
    #THIS IS BAD
        feeds = defaultdict()
    feeds_file.close()
    # RETURNS ONLY THE FIRST FEED ENTRY                                            
    for i in feeds.iteritems():
        print str(i)

    for i in dic['results']:
        hash = computeHash(i['text'])

        if hash not in feeds:
            appendfeed(hash, i, 'tweets.pkl')


def appendfeed(hash, new_feed, file):
    feed = defaultdict()
    file = open(file, 'a+b')
    feed[hash] = new_feed
    pickle.dump(feed, file)
    file.close()

def computeHash(data):
    h = md5(data.encode('utf-8'))
    return h.hexdigest()
4

1 に答える 1

2

feed = defaultdict()が呼び出されるたびに新しいディクショナリ()を作成しappendfeedているため、新しいディクショナリは以前のすべての参照を失います。次に、新しい(単一エントリ)dictをファイルに追加します。

このように複数の個別の呼び出しを復元したい場合は、またはdumpへの複数の一致する呼び出しが必要になると思います。その後、各呼び出しは、それぞれ1つの要素を持つ個別の値を返す必要があります。loadunpickledict

1つの辞書を複数のキーで保存する場合は、appendモードを失い、保存する必要があるときはいつでも辞書全体を再選択します。単純なマッピングを保存するためのより効率的なものが必要な場合は、または突き出しを見てください

于 2011-03-13T01:03:21.960 に答える