2011-03-13 61 views
1

我正在使用cPickle将字典对象存储到文件中,并且无法获取除第一个以外的任何其他条目。最初文件tweets.pkl为空,并且EOFError被引发。我相信它与它有关。由于使用cPickle只返回文件中的第一个条目

#!/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() 

回答

2

你构建一个新字典(feed = defaultdict())每次appendfeed被调用,从而使新字典失去了以前的所有引用。然后,您将新的(单项)字典添加到文件中。

如果你想多个独立的呼叫恢复dump这样,那么你就需要多个匹配调用loadunpickle,我相信。然后,每个呼叫应该分别返回一个单独的dict

如果您想要存储一个带有多个密钥的字典,请丢失append模式,并在需要保存时重新整理字典。如果您想要更高效地存储简单映射,请参阅shelveshove

+0

谢谢。我不知道搁置。这是一种更有效的方式。 – ajmartin 2011-03-13 01:31:10

+0

很高兴帮助。从山景南部的问候:) – phooji 2011-03-13 02:58:45

相关问题