Python-在pickle文件中保存和加载多个对象?

发布于 2021-02-02 23:13:43

我有一堂课,为游戏中的玩家提供服务,创建他们以及其他东西。

我需要将这些播放器对象保存在文件中,以便以后使用。我已经尝试过pickle模块,但是我不知道如何保存多个对象并再次加载它们?有没有办法做到这一点,还是应该使用其他类(例如列表)并将对象保存并加载到列表中?

有没有更好的办法?

关注者
0
被浏览
85
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    到目前为止,使用列表,元组或字典是最常见的方法:

    import pickle
    PIK = "pickle.dat"
    
    data = ["A", "b", "C", "d"]
    with open(PIK, "wb") as f:
        pickle.dump(data, f)
    with open(PIK, "rb") as f:
        print pickle.load(f)
    

    输出:

    ['A', 'b', 'C', 'd']
    

    但是,泡菜文件可以包含任意数量的泡菜。这是产生相同输出的代码。但是请注意,它很难编写和理解:

    with open(PIK, "wb") as f:
        pickle.dump(len(data), f)
        for value in data:
            pickle.dump(value, f)
    data2 = []
    with open(PIK, "rb") as f:
        for _ in range(pickle.load(f)):
            data2.append(pickle.load(f))
    print data2
    

    如果这样做,你有责任知道所写出的文件中有多少个泡菜。上面的代码通过首先腌制列表对象的数量来做到这一点。



  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    首先,如果在到达文件末尾时停止加载,则无需存储单独腌制的项目数:

    def loadall(filename):
        with open(filename, "rb") as f:
            while True:
                try:
                    yield pickle.load(f)
                except EOFError:
                    break
    
    items = loadall(myfilename)
    

    假设文件仅包含泡菜;如果里面还有其他东西,产生器将尝试把里面的其他东西都当作泡菜,这很危险。

    其次,通过这种方式,你不会获得列表,而是生成器。一次只能将一个项目加载到内存中,这在转储的数据非常大时很有用-这可能是你可能想首先腌制多个项目的可能原因。你还可以遍历items一个for循环就好像它是一个列表。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看