【问题标题】:Importing a raw dictionary in to Python that was exported using f.open() [duplicate]将原始字典导入使用 f.open() 导出的 Python [重复]
【发布时间】:2018-01-07 03:23:40
【问题描述】:

每个人。

我正在修改存储字典和稍后检索它们的方法,将它们加载到现有字典值中并替换它们。

我打算用它来将游戏数据存储在一个简单的基于文本的游戏中。

# Player dictionaries

p1 = {'name' : "placeholder", 'hp': 0, 'str': 0, 'stm': 0, 'mana': 0,
      'atk': 0, 'def': 0, 'cyra' : 0, 'monero' : 0, 'bits': 0, 'dollars': 0,
      'nordas': 0,}
p2 = {'name' : "placeholder", 'hp': 0, 'str': 0, 'stm': 0, 'mana': 0,
      'atk': 0, 'def': 0, 'cyra' : 0, 'monero' : 0, 'bits': 0, 'dollars': 0,
      'nordas': 0,}
p3 = {'name' : "placeholder", 'hp': 0, 'str': 0, 'stm': 0, 'mana': 0,
      'atk': 0, 'def': 0, 'cyra' : 0, 'monero' : 0, 'bits': 0, 'dollars': 0,
      'nordas': 0,}
p4 = {'name' : "placeholder", 'hp': 0, 'str': 0, 'stm': 0, 'mana': 0,
      'atk': 0, 'def': 0, 'cyra' : 0, 'monero' : 0, 'bits': 0, 'dollars': 0,
      'nordas': 0,}
p5 = {'name' : "placeholder", 'hp': 0, 'str': 0, 'stm': 0, 'mana': 0,
      'atk': 0, 'def': 0, 'cyra' : 0, 'monero' : 0, 'bits': 0, 'dollars': 0,
      'nordas': 0,}
p6 = {'name' : "placeholder", 'hp': 0, 'str': 0, 'stm': 0, 'mana': 0,
      'atk': 0, 'def': 0, 'cyra' : 0, 'monero' : 0, 'bits': 0, 'dollars': 0,
      'nordas': 0,}

#save function
import pickle
def save() :
    f = open("p1.txt","w")
    f.write( str(p1) )
    f.close()

    f = open("p2.txt","w")
    f.write( str(p2) )
    f.close()

    f = open("p3.txt","w")
    f.write( str(p3) )
    f.close()

    f = open("p4.txt","w")
    f.write( str(p4) )
    f.close()

    f = open("p5.txt","w")
    f.write( str(p5) )
    f.close()

    f = open("p6.txt","w")
    f.write( str(p6) )
    f.close()

    print ("The game was saved.")

令我高兴的是,我发现这确实有效,它在保存程序的文件夹中创建了六个文件名“p1.txt”、“p2.txt”等。它看起来和原来的字典一模一样:

{'name': 'placeholder', 'hp': 0, 'str': 0, 'stm': 0, 'mana': 0, 'atk': 0, 'def': 0, 'cyra': 0, 'monero': 0, 'bits': 0, 'dollars': 0, 'nordas': 0}

但是,在尝试创建 import_save() 函数时,我遇到了问题。我不能使用unpickle(),因为这不是我首先导出字典的方式。有关如何解决此问题的任何提示?

我也在寻找一种方法,让导入的字典可以覆盖现有的字典?我找不到任何关于它的信息...如果需要,我不反对重写代码。

【问题讨论】:

  • 只是一个想法,但为什么不改用json module。此外,IMO 也最好在 with 上下文中打开。
  • 如果您向我们展示您的 import_save() 函数可能会有所帮助
  • 为什么还要6个文件?只需将所有字典或另一个字典添加到列表中,然后使用 json.dump 将其存储在单个文件中(然后使用 json.load 再次读取)
  • Patrick Haugh 我同意,this answer 具有 pickle 替代使用 json 并避免不应命名的危险邪恶功能
  • 我不是 json 的粉丝,因为并非所有的 Python 字典都符合 json standard。我可能会使用ast.literal_evalpickle

标签: python


【解决方案1】:

试试这个:

import json

# save to file
with open("p1.txt", "w") as f:
    json.dump(p1, f)

# read from file
with open("p1.txt", "r") as f:
    p1 = json.load(f)

尽管正如 Patrick Haugh 提到的那样,并且重复的答案也表明,json 会将所有字典键转换为 unicode 字符串,因此,例如,如果您有像 {1: 'a'} 这样的整数,解码后将是 {u'1': u'a'},这不是与原始字典相同 - 注意现在的键是字符串,而不是整数。使用pickle 模块可以避免这个特殊问题,但它不是人类可读的,也不是其他计算机语言可读的——pickle 是一个 Python 对象序列化。

【讨论】:

    【解决方案2】:

    正如@Mark 建议的那样,json 是最好的方法:

    import json
    
    p_list = [p1, p2, p3, p4, p5, p6]
    
    # Write
    for i in range(1, 7):
        with open('p'+str(i)+'.json', 'w') as f:
            json.dump(p_list[i-1], f)
    
    #Read
    p_read_list = list()
    for i in range(1, 7):
        with open('p'+str(i)+'.json', 'r') as f:
            p_read_list.append(json.load(f))
    
    print(p_read_list[0])
    

    【讨论】:

    • 谢谢。我可以一步一步地问这是做什么的吗?
    • 我们首先创建一个字典列表,然后json.dump() 将第 i 个字典转储到文件 f(名称为 p<i>.json)中,然后将其加载回来,我们使用 json.load()
    • 谢谢!我会试试这个并报告。
    猜你喜欢
    • 2016-01-23
    • 1970-01-01
    • 2021-03-14
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2011-01-11
    相关资源
    最近更新 更多