2013-08-15 11 views
15

Das Problem, das ich habe, ist, wenn ich versuche, das pickled Objekt zu laden. Ich habe versucht, sowohl pickle.loads und pickle.load Hier verwendet die Ergebnisse:Kann eingelegtes Objekt nicht laden

pickle.loads - TypeError: 'str' does not support the buffer interface

pickle.load - TypeError: file must have 'read' and 'readline' attributes

Kann jemand bitte sagen Sie mir, was ich falsch in diesem Prozess mache? Danke, und hier ist mein Code:

elif str(parser) == 'SwissWithdrawn_Parser': 
     # swissprot name changes 
     print('Gathering SwissProt update info...') 
     cache_hits = 0 
     cache_misses = 0 
     files = set() 

     for f in os.listdir('out/cache/'): 
      if os.path.isfile('out/cache/'+f): 
       files.add(f) 

     for name in sp_lost_names: 

      cached = False 
      url = 'http://www.uniprot.org/uniprot/?query=mnemonic%3a'+name+ \ 
       '+active%3ayes&format=tab&columns=entry%20name' 
      hashed_url = str(hash(url)) 

      ################### For Testing Only - use cache ################## 
      if hashed_url in files: 
       cached = True 
       cache_hits += 1 
       content = pickle.loads('out/cache/' +hashed_url) # <-- problematic line 
      else: 
       cache_misses += 1 
       content = urllib.request.urlopen(url) 

      # get the contents returned from the HTTPResponse object 
      content_list = [x.decode().strip() for x in content.readlines()] 
      if not cached: 
       with open('out/cache/'+hashed_url, 'wb') as fp: 
        pickle.dump(content_list, fp) 
      #################################################################### 

      # no replacement 
      if len(content_list) is 0: 
       change_log['swiss-names'] = 
        { name : 'withdrawn' } 
      # get the new name 
      else: 
       new_name = content_list[1] 
       change_log['swiss-names'] = 
        { name : new_name } 

Antwort

27

Sie müssen entweder lesen die Datei zuerst (als binäre bytes) und verwenden pickle.loads() oder eine geöffnete Datei-Objekt übergeben an den pickle.load() Befehl. Letzteres ist vorzuziehen:

with open('out/cache/' +hashed_url, 'rb') as pickle_file: 
    content = pickle.load(pickle_file) 

Keine Methode unterstützt das Laden eines Pickles aus einem Dateinamen.

+0

Danke, dank deiner Antwort konnte ich endlich meine erste Implementierung eines Caches zum Laufen bringen! :) – Houdini