Python 清除通过几个pickler.dump调用保存的pickle数据的干净方法
要取消使用几个pickler.dump调用保存的pickle数据,我们需要相同数量的调用来取消pickler.load。一种快速而肮脏的方法是使用如下的try-except块:Python 清除通过几个pickler.dump调用保存的pickle数据的干净方法,python,Python,要取消使用几个pickler.dump调用保存的pickle数据,我们需要相同数量的调用来取消pickler.load。一种快速而肮脏的方法是使用如下的try-except块: with open("data.pk", "wb") as f: pickler = pickle.Pickler(f) pickler.dump("message1") pickler.dump("message2") pickler.dump("message3") with ope
with open("data.pk", "wb") as f:
pickler = pickle.Pickler(f)
pickler.dump("message1")
pickler.dump("message2")
pickler.dump("message3")
with open("data.pk", "rb") as f:
unpickler = pickle.Unpickler(f)
while True:
try:
loaded_data = unpickler.load()
except Exception:
break
print("loaded:", loaded_data)
然而,在我看来,依靠异常处理来实现这一点似乎是一种廉价的黑客行为。这是一个好方法还是有更好的方法?如果我想提前知道所需的调用数,我是否应该在文件开头显式地保存它?这是一个很好的方法;您只需读取文件存储的所有pickle 另一种方法是首先将对象计数写入文件:
with open("data.pk", "wb") as f:
f.write((3).to_bytes(2, 'big')) # 2 bytes gives you enough room for expansion
pickler = pickle.Pickler(f)
pickler.dump("message1")
pickler.dump("message2")
pickler.dump("message3")
with open("data.pk", "rb") as f:
count = int.from_bytes(f.read(2), 'big')
unpickler = pickle.Unpickler(f)
for i in range(count):
loaded_data = unpickler.load()
print("loaded:", loaded_data)
正如@Martijn Pieters所说,你目前的方法没有什么问题。如果您想使实际获取数据的代码更具可读性(即更简洁和“更干净”),可以创建一个函数来隐藏丑陋的细节:
import pickle
def unpickled_items(filename):
""" Unpickle a file of pickled data. """
with open(filename, "rb") as f:
while True:
try:
yield pickle.load(f)
except EOFError:
break
# Create test file.
with open("data.pk", "wb") as f:
pickler = pickle.Pickler(f)
pickler.dump("message1")
pickler.dump("message2")
pickler.dump("message3")
loaded_data = [item for item in unpickled_items("data.pk")]
print("saved data:", loaded_data)