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

1 投票
1 回答
527 浏览
提问于 2025-04-16 13:35

我正在使用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 个回答

2

每次调用 appendfeed 的时候,你都在创建一个新的字典(feed = defaultdict()),这样新创建的字典就会丢失之前的所有内容。然后你把这个新字典(里面只有一个条目)添加到文件里。

如果你想要恢复多次调用 dump 的结果,那么你需要多次对应的调用 loadunpickle。每次调用应该返回一个包含一个元素的独立 dict

如果你想存储一个包含多个键的字典,就不要使用 append 模式,而是每次需要保存的时候重新保存整个字典。如果你想要更高效地存储简单的映射,可以看看 shelveshove

撰写回答