2013-08-15 24 views
15

Problem, który mam, to próba załadowania obiektu pickled. Próbowałem przy użyciu zarówno pickle.loads i pickle.load Oto wyniki:Nie można załadować obiektu piklowanego

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

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

Czy ktoś mógłby mi powiedzieć co robię źle w tym procesie? Dzięki, i tu jest mój kod:

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 } 

Odpowiedz

27

Trzeba albo czytać plik pierwszy (jak binarny bytes) i używać pickle.loads() lub przekazać obiekt pliku otwartego do komendy pickle.load(). To ostatnie jest preferowane:

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

Żadna z metod nie obsługuje ładowania pikle z nazwy pliku.

+0

Dziękuję, dzięki twojej odpowiedzi udało mi się w końcu uzyskać moją pierwszą implementację pamięci podręcznej! :) – Houdini

Powiązane problemy