web-dev-qa-db-ja.com

ピクル-存在する場合は変数をロードするか、変数を作成して保存します

変数がすでに存在する場合にpickleを使用して変数をロードするか、存在しない場合は作成してダンプするより良い方法はありますか?

if os.path.isfile("var.pickle"):
    foo = pickle.load( open( "var.pickle", "rb" ) )
else:
    foo = 3
    pickle.dump( foo, open( "var.pickle", "wb" ) )
20
Matteo

あなたは EAFP主義許しを求める に従うことができます:

import pickle

try:
    foo = pickle.load(open("var.pickle", "rb"))
except (OSError, IOError) as e:
    foo = 3
    pickle.dump(foo, open("var.pickle", "wb"))
26
alecxe

再利用性のために関数に入れ、ファイルの制御フローのエラーキャッチを回避します。効率が悪くなるためです。また、コンテキストマネージャーを使用してファイルを開きます。

_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
_
7
Aaron Hall