25

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

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

4

8 回答 8

60

为什么不将其转储到 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)

从 JSON 加载相当有效。

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

于 2012-08-06T00:32:13.347 回答
21

Why mess with all these serialization methods? It's already written to a file as a Python dict (although with the unfortunate name 'dict'). Change your program to write out the data with a better variable name - maybe 'data', or 'catalog', and save the file as a Python file, say data.py. Then you can just import the data directly at runtime without any clumsy copy/pasting or JSON/shelve/etc. parsing:

from data import catalog
于 2012-08-06T06:11:05.430 回答
6

在许多情况下,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'
于 2012-08-06T01:07:54.790 回答
5

如果键都是字符串,可以使用shelve模块

架子是一个持久的、类似字典的对象。与“dbm”数据库的区别在于架子中的值(不是键!)本质上可以是任意的 Python 对象——pickle 模块可以处理的任何东西。这包括大多数类实例、递归数据类型和包含大量共享子对象的对象。键是普通字符串。

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

于 2012-08-06T01:31:46.573 回答
3

如果存储效率很重要,请使用 Pickle 或 Cpickle(用于提高执行性能)。正如 Amber 所指出的,您还可以通过 Json 转储/加载。它将是人类可读的,但需要更多磁盘。

于 2012-08-06T00:46:05.400 回答
3

我建议您考虑使用该shelve模块,因为您的数据结构是一个映射。这是我对标题为“如果我想构建自定义数据库,我该怎么做? ”的类似问题的回答。在我的另一个答案中还有一些示例代码,用于推广如何获取对象数据库?

ActiveState 有一个高度评价的PersistentDict配方,它支持 csv、json 和 pickle 输出文件格式。它非常快,因为所有这三种格式都是用 C 实现的(尽管配方本身是纯 Python),所以它在打开文件时将整个文件读入内存这一事实可能是可以接受的。

于 2012-08-06T01:48:40.800 回答
0

在 JSON 方向上,还有一种叫做 simpleJSON 的东西。我第一次在 python 中使用 json,json 库对我不起作用/我想不通。simpleJSON...更易于使用

于 2012-08-06T02:01:49.880 回答
0

JSON(或 YAML 或其他)序列化可能更好,但如果您已经将字典写入 python 语法的文本文件,并完成了变量名绑定,则可以将其写入 .py 文件。然后该 python 文件将可以按原样导入和使用。不需要“返回字典的函数”方法,因为您可以直接将其用作该文件中的全局变量。例如

# generated.py
please_dont_use_dict_as_a_variable_name = {'Adam': 'Room 430', 'Bob': 'Room 404'}

而不是:

# manually_copied.py
def get_dict():
    return {'Adam': 'Room 430', 'Bob': 'Room 404'}

唯一的区别是manually_copied.get_dict每次都为您提供字典的新副本,而generated.please_dont_use_dict_as_a_variable_name[1] 是单个共享对象。如果您在检索字典后在程序中修改字典,这可能很重要,但如果您需要独立修改一个字典,您始终可以使用copy.copycopy.deepcopy创建一个新副本。


[1] dict, list, str, int,map等通常被视为错误的变量名。原因是这些已经被定义为内置,并且非常常用。因此,如果你给某个东西起这样的名字,至少它会导致阅读你的代码的人(包括你离开一段时间后的你)产生认知失调,因为他们必须记住“dict不是意思是它通常在这里做的事情”。也很有可能在某些时候你会得到一个令人恼火的解决错误报告dict对象不可调用(或其他东西),因为一些代码正在尝试使用type dict,但正在获取你的字典对象dict而是绑定到名称。

于 2012-08-06T02:53:25.367 回答