Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 清除通过几个pickler.dump调用保存的pickle数据的干净方法_Python - Fatal编程技术网

Python 清除通过几个pickler.dump调用保存的pickle数据的干净方法

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

要取消使用几个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 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)