変数がすでに存在する場合にpickle
を使用して変数をロードするか、存在しない場合は作成してダンプするより良い方法はありますか?
if os.path.isfile("var.pickle"):
foo = pickle.load( open( "var.pickle", "rb" ) )
else:
foo = 3
pickle.dump( foo, open( "var.pickle", "wb" ) )
再利用性のために関数に入れ、ファイルの制御フローのエラーキャッチを回避します。効率が悪くなるためです。また、コンテキストマネージャーを使用してファイルを開きます。
_import os
import pickle
def read_or_new_pickle(path, default):
if os.path.isfile(path):
with open(path, "rb") as f:
try:
return pickle.load(f)
except Exception: # so many things could go wrong, can't be more specific.
pass
with open(path, "wb") as f:
pickle.dump(default, f)
return default
_
使用法:
_foo = read_or_new_pickle(path="var.pickle", default=3)
_
foo
は_3
_を返します
_foo = read_or_new_pickle(path="var.pickle", default=4)
_
そしてfoo
は_3
_を返します。
確かに、以下はかなり簡潔でエレガントですが、多くのことがうまくいかない可能性があるため、キャッチする必要がありますeverything(信じられませんか?これを試してください:import io, pickle; pickle.load(io.BytesIO(b"\x00"))
そしてバイナリで遊んでください):
_import pickle
def read_or_new_pickle(path, default):
try:
foo = pickle.load(open(path, "rb"))
except Exception:
foo = default
pickle.dump(foo, open(path, "wb"))
return foo
_
同じ使い方。しかし、ファイルが空であるか形式が正しくない場合に、2回目にファイルを開くときのエラーを回避するのに十分な速さでファイルが閉じられないのではないかと心配しています。したがって、コンテキストマネージャを使用します。
_import pickle
def read_or_new_pickle(path, default):
try:
with open(path, "rb") as f:
foo = pickle.load(f)
except Exception:
foo = default
with open(path, "wb") as f:
pickle.dump(foo, f)
return foo
_