私が抱えている問題は、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 }
read最初にファイルを(バイナリbytes
として)使用し、pickle.loads()
を使用するか、開いているファイルオブジェクトをpickle.load()
に渡す必要があります。コマンド。後者が望ましい:
with open('out/cache/' +hashed_url, 'rb') as pickle_file:
content = pickle.load(pickle_file)
どちらの方法も、ファイル名からのピクルの読み込みをサポートしていません。