使用cPickle只返回文件中的第一个条目

时间:2011-03-13 00:44:20

标签: python pickle eoferror

我正在使用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()

1 个答案:

答案 0 :(得分:2)

每次调用feed = defaultdict()时,您都在构建一个新字典(appendfeed),以便新字典丢失所有以前的引用。然后,您将新的(单项)dict附加到文件中。

如果你想恢复多次这样的dump个电话,那么你需要多次匹配loadunpickle,我相信。然后,每个调用都应返回一个单独的dict,每个调用一个元素。

如果要存储一个包含多个键的字典,请丢失append模式,并在需要保存时重新选择整个字典。如果您想要更有效地存储简单映射,请查看shelveshove