使用Python永久存储字典的优雅方式?

zhu*_*yxn 19 python database json dictionary

目前昂贵地解析文件,该文件生成约400个键值对的字典,其很少更新.以前有一个解析文件的函数,用字典语法(即.dict = {'Adam': 'Room 430', 'Bob': 'Room 404'})等将它写入文本文件,并将其复制并粘贴到另一个函数中,该函数的唯一目的是返回该解析的字典.

因此,在我将使用该字典的每个文件中,我将导入该函数,并将其分配给变量,现在是该字典.想知道是否有更优雅的方法来做到这一点,这不涉及明确地复制和粘贴代码?使用数据库似乎是不必要的,并且文本文件给了我在将其添加到函数之前查看解析是否正确完成的好处.但我愿意接受建议.

Amb*_*ber 42

为什么不将它转储到JSON文件,然后从你需要的地方加载它?

import json

with open('my_dict.json', 'w') as f:
    json.dump(my_dict, f)

# elsewhere...

with open('my_dict.json') as f:
    my_dict = json.load(f)
Run Code Online (Sandbox Code Playgroud)

从JSON加载相当有效.

另一种选择是使用pickle,但与JSON不同,它生成的文件不是人类可读的,因此您会丢失您从旧方法中获得的视觉验证.


Pau*_*McG 18

为什么搞乱所有这些序列化方法?它已经作为Python dict写入文件(虽然名字'dict'不幸).更改程序以使用更好的变量名称写出数据 - 可能是"数据"或"目录",并将文件保存为Python文件,例如data.py. 然后,您可以直接在运行时导入数据,而无需任何笨拙的复制/粘贴或JSON /搁置/等.解析:

from data import catalog
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么这不是一个更受欢迎的选择。每个人似乎都默认使用 json,但这使得导入对于程序员来说更容易读/写,而且,至少在我的系统上,它运行得也更快。 (2认同)

sen*_*rle 5

在许多情况下,JSON 可能是正确的方法;但可能有另一种选择。看起来你的键和值总是字符串,对吗?您可以考虑使用dbm/ anydbm。这些是“数据库”,但它们的作用几乎与字典完全一样。它们非常适合廉价的数据持久性。

>>> import anydbm
>>> dict_of_strings = anydbm.open('data', 'c')
>>> dict_of_strings['foo'] = 'bar'
>>> dict_of_strings.close()
>>> dict_of_strings = anydbm.open('data')
>>> dict_of_strings['foo']
'bar'
Run Code Online (Sandbox Code Playgroud)


Joh*_*ooy 5

如果key都是字符串,可以使用shelf模块

\n\n
\n

架子是一个持久的、类似字典的对象。与 \n \xe2\x80\x9cdbm\xe2\x80\x9d 数据库的区别在于,架子中的值(不是键!)基本上可以是\n 基本上任意的 Python 对象 \xe2\x80\x94 pickle 模块中的任何内容\n 可以处理。这包括大多数类实例、递归数据类型和包含大量共享子对象的对象。键是普通字符串。

\n
\n\n

json如果您需要使用其他语言的数据将是一个不错的选择

\n