2011-03-13 5 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과 같이 여러 번 개별 호출을 복원하려면 load 또는 unpickle과 일치하는 호출이 여러 개 필요할 것입니다. 각 호출은 각각 하나의 요소가있는 별도의 dict을 반환해야합니다.

하나의 사전을 여러 개의 키로 저장하려면 append 모드를 잃고 저장해야 할 때마다 사전 전체를 다시 피클 링하십시오. 단순한 매핑을 저장하는 데 더 효율적인 것이 필요하다면 shelve 또는 shove

+0

을 참조하십시오. 나는 선반에 대해 몰랐다. 더 효율적인 방법입니다. – ajmartin

+0

도와 드리겠습니다. 마운틴 뷰의 바로 남쪽에서 감사합니다 :) – phooji

관련 문제