использование cPickle возвращает только первую запись в файле - PullRequest
1 голос
/ 13 марта 2011

Я сохраняю объект словаря в файл, используя 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 голосов
/ 13 марта 2011

Вы создаете новый словарь (feed = defaultdict()) каждый раз, когда вызывается appendfeed, так что новый словарь теряет все предыдущие ссылки.Затем вы добавляете новый (однократный) dict к файлу.

Если вы хотите восстановить несколько отдельных вызовов на dump, как это, то вам потребуется несколько совпадающих вызовов на load илиunpickle, я верю.Затем каждый вызов должен возвращать отдельный dict с одним элементом.

Если вы хотите сохранить один словарь с несколькими ключами, потеряйте режим append и просто переизбирайте весь словарь всякий раз, когда вам нужноспасти.Если вы хотите что-то более эффективное для хранения простых отображений, взгляните на shelve или shove

...