如何将带有列表键的python字典保存到文件中?

时间:2017-10-29 13:15:54

标签: python file dictionary save

如何将带有列表键的python字典保存到文件中?我已经尝试了json,但它说它只适用于字符串键,我的字典看起来像这样:

for(i in names(houseDF)){
  print(i)
  print(nrow(houseDF[is.na(houseDF[i]),]))
  print("---------------------")
}

我必须保持这种形式。 谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

味酸

Python有一个名为pickle的包,您可以使用它将vanilla对象(以及更高级的对象,但不是所有内容)存储到二进制文件中。

你可以这样做:

import pickle

with open('file.bin', 'wb') as file:
    pickle.dump(your_dict, file)

稍后您可以使用以下方法检索字典:

import pickle

with open('file.bin', 'rb') as file:
    your_dict = pickle.load(file)

pickle的可能问题是你不能腌制所有东西(不是lambda表达式等),而且因为你有一些自由来挑选任意对象,不幸的是你必须信任该文件:黑客可以用你的文件替换你的文件一个操纵文件,通过它可以访问您可能想隐藏的部分代码。

此外,pickle是一种开放格式:它被指定,这意味着你可以为了好处操作一个pickle,但是一个人当然可以以你不想要/期望的方式改变文件。所以要小心这些文件:不要让用户只上传一个,然后检查它。

reprliteral_eval

或者,您可以将repr(..)用于元组,整数,字符串等,这样可以正常工作。所以,如果你写:

>>> repr(your_dict)
"{(24222, 64130): 'whatever', (24270, 64130): 'whatever', (24240, 64130): 'whatever'}"

我们获得一个包含文本表示的字符串。因此,我们可以将其写入如下文件:

with open('file.txt', 'w') as file:
    file.write(repr(your_dict))

稍后我们可以使用ast包再次加载文字:

from ast import literal_eval

with open('file.txt') as file:
    your_dict = literal_eval(file.read())

这样做的好处是,它是一种可以轻松更改的可读格式,而且literal_eval只会解析文字,因此可以安全使用。

答案 1 :(得分:1)

虽然@WillemVanOnsem的解决方案肯定更符合OP的要求,但下面的解决方案说明了如何将字典保存到文件并使用字符串检索它:

s = {(24222, 64130): 'whatever', (24270, 64130): 'whatever', (24240, 64130): 'whatever'}
f = open('the_file.txt', 'w')
for a, b in s.items():
    f.write("{} {}\n".format(','.join(map(str, a)), b)

f.close()
#to retrieve:
data = {tuple(map(int, a.split(','))):b for a, b in [i.strip('\n').split() for i in open('the_file.txt')]}

答案 2 :(得分:1)

将字典转换为字符串并将其写入文件。

dict_val = {(24222, 64130): 'whatever', (24270, 64130): 'whatever', (24240, 64130): 'whatever'}

with open('file.txt','w') as f:
     f.write(str(dict_val))