web-dev-qa-db-ja.com

漬け物を読み込めません

私が抱えている問題は、pickledオブジェクトをロードしようとしたときです。両方を使用してみましたpickle.loadsおよびpickle.load結果は次のとおりです。

pickle.loads

TypeError: 'str'はバッファーインターフェイスをサポートしていません

pickle.load

TypeError:ファイルには「read」および「readline」属性が必要です

このプロセスで私が間違っていることを誰かが教えてもらえますか?

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 }
43
Houdini

read最初にファイルを(バイナリbytesとして)使用し、pickle.loads()を使用するか、開いているファイルオブジェクトをpickle.load()に渡す必要があります。コマンド。後者が望ましい:

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

どちらの方法も、ファイル名からのピクルの読み込みをサポートしていません。

62
Martijn Pieters