ich es in einer Funktion zur Wiederverwertbarkeit setzen würde, vermeiden Fehler in der Datei für die Ablaufsteuerung zu kontrollieren, da es weniger effizient ist, und ich würde Kontext-Manager verwenden, um die Datei zu öffnen.
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 StandardError: # so many things could go wrong, can't be more specific.
pass
with open(path, "wb") as f:
pickle.dump(default, f)
return default
Nutzung:
foo = read_or_new_pickle(path="var.pickle", default=3)
foo
kehrt 3
foo = read_or_new_pickle(path="var.pickle", default=4)
und foo
noch gibt 3
.
Zugegeben, das folgende ist ziemlich kurz und elegant, aber zu viele Dinge schief gehen könnte, und Sie würden fangen müssen alles (glauben mir nicht versuchen, diese:? import io, pickle; pickle.load(io.BytesIO(b"\x00"))
und mit dem binären spielen):
import pickle
def read_or_new_pickle(path, default):
try:
foo = pickle.load(open(path, "rb"))
except StandardError:
foo = default
pickle.dump(foo, open(path, "wb"))
return foo
Gleiche Verwendung. Aber ich bin besorgt, dass die Datei möglicherweise nicht schnell genug geschlossen wird, um einen Fehler beim zweiten Öffnen im Falle einer leeren oder fehlerhaften Datei zu vermeiden. Verwenden Sie also den Kontextmanager:
import pickle
def read_or_new_pickle(path, default):
try:
with open(path, "rb") as f:
foo = pickle.load(f)
except StandardError:
foo = default
with open(path, "wb") as f:
pickle.dump(foo, f)
return foo