【问题标题】:Calling pickle method调用泡菜方法
【发布时间】:2020-01-06 15:07:49
【问题描述】:

我在输出我在程序中创建的 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

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

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

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

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

【问题讨论】:

  • “它不起作用”不够具体。请描述问题:您是否遇到错误?你的电脑炸了吗? 如何它“不工作”?
  • @Carcigenicate 它只是关闭程序并且什么都不做。
  • @ForceBru 只是关闭程序而不是按我的预期保存数据。
  • @motspeed,你有什么意见?将print(repri(line)) 放在line = input("Insert Comand: ") 之后,运行您的代码并显示输入和输出
  • @motspeed 你对腌制数据做了什么?你把它保存在任何地方吗?

标签: python python-3.x pickle


【解决方案1】:

您的部分问题是我认为对泡菜的作用和用途存在误解。

它可以用来保存保存状态,而不是你正在做的方式。

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

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

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

要加载保存的 dict 或对象,您需要读取文本文件或通过套接字接收字节字符串,然后 unpickle 和瞧,您有一个对象。

要对其进行测试并帮助您了解其工作原理,请跳入 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()

现在我们已经检索到我们腌制的字典,所以我们需要取消腌制它。

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

【讨论】:

  • 是的,我明白了,我什至尝试在记事本上打开文件,它看起来有点加密。但我明白它是如何在这样的简单字典上工作的。我无法从 game() 方法中获取数据。即使将 game() 重命名为 fun.game() 我得到错误 dump() missing required argument 'file' (pos 2)
  • 试试dumps 而不是dump
  • 似乎工作正常,至少我没有收到错误。但是不应该在文件夹中创建文件吗?它没有创造任何东西。真的不知道,因为当我尝试加载方法时,我得到:“文件必须具有 'read' 和 'readline' 属性。我尝试了 dados = pickle.load(fun.game()) 和 dados = pickle.loads( fun.game())
  • 所以正如我上面提到的loadsdumps 只腌制和解开。 load 从打开的文件中提取数据。 dump 将腌制数据写入打开的文件。 pickle.loads(fun.game()) 不会做任何事情,因为你交给它的字典已经是一个字典并且未腌制。
  • Nvm,我的错误!现在终于可以用了!我不能感谢你,谢谢你的帮助。
猜你喜欢
  • 2012-09-09
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多