2013-08-15 21 views
15

Il problema che si verifica è quando si tenta di caricare l'oggetto . Ho provato utilizzando sia pickle.loads e pickle.load Ecco i risultati:Impossibile caricare l'oggetto in salamoia

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

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

Qualcuno può dirmi che cosa sto facendo male in questo processo? Grazie, e qui è il mio codice:

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 } 

risposta

27

Devi o leggere il file prima (come binario bytes) e utilizzare pickle.loads(), o passare un oggetto file aperto al comando pickle.load(). Quest'ultimo è preferibile:

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

Nessun metodo supporta il caricamento di un pickle da un nome file.

+0

Grazie, grazie alla tua risposta sono riuscito a ottenere finalmente la mia prima implementazione di un cache funzionante! :) – Houdini