调用 pickle 方法

Calling pickle method

我在输出我在程序中创建的 2 个函数时遇到了一些问题。 我有以下词典:

def game():
    return {
    'players': [],
    'active_players':[],
    'running_game': False,

我从这里收集数据:

def player_register(mm,name):
    board1_for_ship_placement = create_grid(columns_size,rows_size)
    board2_for_showing = create_grid(columns_size,rows_size)
    player = {
        'name':name,
        'played_games': 0,
        'victory': 0,
        'ships_available' : {
            "speeder":0,
            "sub":0,
            "frag":0,
            "cruz":0,
        "spaceship":0
        },
        'ships_in_use':[],
        'board1': board1_for_ship_placement,
        'board2': board2_for_showing
    }
    mm['players'].append(player)

然后我创建了 2 个函数来保存和加载:

def save():
    my_dict = game()
    with open("my_data.pkl", "wb") as f:
        pickle.dump(my_dict, f)

def load():
    with open("my_data.pkl", "rb") as f:
    my_data = pickle.load(f)

这是我的菜单功能:

def main():
    mm = fun.game()
    letters_dict = fun.dict_letters()
    ships_size = fun.check_ships_size()
    while True:
        line = input("Insert Comand: ")
        if not line: # checks if input is empty line , if so
            break # it breaks out of while loop
        commands = line.split(" ")
        elif commands[0] == "G":
            commandG(commands,fun)
        elif commands[0] == "L":
            commandL(commands,fun)
        elif commands[0] == "teste":
            print(mm['jogadores_em_ativo'])
        elif commands[0] == "break":
            break

我构建了这 2 个函数(一个用于加载,一个用于保存):

def commandG(commands,fun):
    dados = pickle.dump(game())
    print("Game Saved")

def commandL(commands,fun):
    dados = pickle.loads(game())
    print("Game Loaded")

但是它不起作用...我是不是漏掉了什么?如何通过按G或L让程序保存和加载数据?

我认为你的部分问题是对 pickle 的作用和用途存在误解。

它可以用来保存保存状态,只是不是你这样做的方式。

让我们从您收到的错误开始。您从中调用它的 python 文件中没有定义游戏函数。所以你不能使用game()。您需要使用 fun.game().

来调用它

其次,您的游戏函数正在返回一个包含一些空列表值和一些 False 值的字典,所以这不是您想要保留的状态。

最后,pickle 的目的是将 python 对象(例如字典)序列化为字节。您想要这样做的原因是您可以通过套接字传输这些字节或将它们保存到文本文件中。

要加载保存的字典或对象,您需要读取文本文件或通过套接字接收字节字符串并解开,瞧,您有一个对象。

要测试它并帮助您了解它是如何工作的,请跳转到 python 控制台并 运行 这些命令。

import pickle
test = {'test':69}
print(test)
pickled = pickle.dumps(test)
print(pickled)

注意到您的对象现在只是文本了吗?

with open('file.txt', 'wb') as file:
    file.write(pickled)

现在打开 test.txt 文件,看看它是如何保存的?

with open('file.txt', 'rb') as file:
    file_data = file.read()

现在我们已经检索到我们的 pickled dict,所以我们需要对其进行 unpickle。

unpickled = pickle.loads(file_data)
print(unpickled)

希望这是清楚的。

如果你真的想要这个来保存你的字典。其中,公平地说,我只浏览了你的代码,但看起来你的数据在一个名为 mm.

的字典中

用你的保存和加载功能试试这个。

def commandG(mm):
    with open("my_data.pkl", "wb") as f:
        pickle.dump(mm, f)

def commandL():
    with open("my_data.pkl", "rb") as f:
        mm = pickle.load(f)
    return mm

然后这样称呼他们。

commandG(mm)

mm = commandL()

您还需要在此 python 文件中 import pickle