【问题标题】:Writing a tuple and int key dictionary to file将元组和 int 键字典写入文件
【发布时间】:2016-12-13 15:24:26
【问题描述】:

我正在尝试将字典写入(并从中读取)一个文件,其中键是元组和 int 的组合,如下所示:

Q = {((True, False, 1, 0), 1): 100}

我尝试过 pickle、json 和 csv,但似乎无法解决复杂的关键问题,而且我似乎找不到太多关于此类字典的文档。

#json code which works for a tuple only as the key 

def write_file(mat):
    with open('file.json', 'w') as f:
         json.dump(mat, f)

def read_file():
    with open('file.json', 'r') as f:
        try:
            data = json.load(f)
        except ValueError:
            data = {}
    return data

【问题讨论】:

  • 你能发布堆栈跟踪(而不是捕获错误吗?)
  • pickle 应该可以轻松完成。您对此有什么具体问题 - 或者您对其他问题有什么偏好?
  • @Jean-François Fabre:还没有到那一步——write_file():TypeError: key ((True, False, 1, 0), 1) is not a string 中发生了未处理的异常

标签: python json dictionary tuples pickle


【解决方案1】:

泡菜对我来说很好用:

Q = {((True, False, 1, 0), 1): 100}

import pickle

with open("test", "wb") as file:
    pickle.dump(Q, file)
with open("test", "rb") as file:
    QQ=pickle.load(file)
print(QQ)

将输出:

{((True, False, 1, 0), 1): 100}

这是在 python 2.7 上

您能否发布您的泡菜代码以进行比较,包括错误消息?

【讨论】:

  • 我不确定“它有效”是正确的回答方式。如果它对 OP 有效,他/她就不会在这里发帖。
  • 如果 OP 会发布他/她的泡菜代码,我会更正它。无论如何,我确实认为这是一个很好的答案,OP 想要一种存储这本字典的方法,可能使用 pickle。我的回答显示了一种方法来做到这一点。即使 OP 会发布代码,最终它也可能会导致这样的事情。
  • 嘿,考虑到与 JSON 的唯一区别是 pickle.dump 而不是 json.dump,我没有发布泡菜代码,我认为它在问题中占用了很多空间,但我的不好...所以我的代码与您的代码相同,除了在读取文件中进行尝试,是的,我正在使用 python 2.7 抱歉应该将其包含在问题中
  • 无需道歉。如果我以咄咄逼人的态度过来,我很抱歉。您能否尝试运行我的代码并发布错误消息。
【解决方案2】:

这可能会解决您的问题。我基本上将您拥有的元组转换为字符串,创建一个新字典。我将它存储到 json 文件中,然后使用 eval 内置函数取回元组。虽然这可行,但如果您不知道数据来自哪里,请小心使用 eval 函数。

Q = {((True, False, 1, 0), 1): 100}
Q_new = dict([(str(i),j) for i,j in Q.items()])

def write_file(mat):
    with open('file.json', 'w') as f:
        json.dump(mat, f)

def read_file():
    with open('file.json', 'r') as f:
        data = json.load(f)
        return dict([(eval(str(i)),j) for i,j in data.items()])

write_file(Q_new)
print(read_file())

输出:

{((True, False, 1, 0), 1): 100}

【讨论】:

    【解决方案3】:

    正如我所说,pickle 可以使用复杂的文件键轻松保存和恢复字典的内容(并将其读回)。

    如果您真的想要使用 JSON 格式来执行此操作,您可以利用这一事实,并将 pickled 数据存储为“普通” Python dict 中的特殊键:

    import json
    import pickle
    
    def my_dump(obj, *args, **kwargs):
        if isinstance(obj, dict):
            pkl = {'_python_object': pickle.dumps(obj)}
            return _orig_dump(pkl, *args, **kwargs)
        return _orig_dump(obj, *args, **kwargs)
    
    # monkey-patch json module to use our dump function (optional)
    _orig_dump = json.dump
    json.dump = my_dump
    
    def as_python_object(dct):
        if '_python_object' in dct:
            return pickle.loads(str(dct['_python_object']))
        return dct
    
    def write_file(mat):
        with open('file.json', 'w') as f:
             json.dump(mat, f)
    
    def read_file():
        with open('file.json', 'r') as f:
            data = json.load(f, object_hook=as_python_object)
        return data
    
    Q = {((True, False, 1, 0), 1): 100}
    write_file(Q)
    d = read_file()
    print(d)  # -> {((True, False, 1, 0), 1): 100}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多