python中简单数据存储的最佳格式

时间:2012-06-20 23:59:55

标签: python

作为一个相对较新的程序员,我曾多次遇到这样的情况,即从外部源读取和汇编程序数据而不是将其写入代码中对我有益。当存在大量相同类型的对象时,大多数情况都是如此。在这种情况下,对象定义会迅速占用代码中的大量空间,并增加了对可读性的不必要的障碍。

作为一个例子,我一直在研究基于文本的RPG,它有大量的房间和项目需要跟踪。即使是少数项目和房间也会导致大量的对象创建代码。

我认为在这种情况下使用某种格式的外部数据存储(从文件读取)会更容易。在这样的文件中,项目和房间将按名称和属性存储,以便它们可以相对容易地解析为对象。

哪种格式最适合这种情况?我觉得像SQL这样的成熟数据库会给相当轻松的脚本增加不必要的膨胀。另一方面,通过外部应用程序或其他python脚本,编辑此数据的简单方法很重要。在更轻松的事情上,我听到的最少提到的是XML,JSON和YAML。

从我所看到的情况来看,XML似乎不是最佳选择,因为许多人似乎发现它很复杂且难以有效地工作。

JSON和YAML似乎可能有用,但我不知道从外部编辑会有多容易。 在这种情况下,速度不是主要关注点。虽然更快的实现当然是可取的,但它并不是我可以使用的限制因素。

我在这里和谷歌都环顾四周,虽然我已经看过很多关于这个主题的内容,但我找不到任何对我有用的东西。像JSON或YAML这样的格式是否足够,或者我会更好地使用完整的数据库?

7 个答案:

答案 0 :(得分:5)

虽然这里已经有了很好的答案,但我只是推荐JSON用于你的目的,唯一的原因是因为你是一个新的程序员,它将是最直接的阅读和翻译,因为它具有最直接的映射到本机Python数据类型(列出[]和词典{})。可读性有很长的路要走,也是Python编程的原则之一。

答案 1 :(得分:4)

我非常喜欢使用Python Pickles将数据存储在文件中。

Pickle可以正确地序列化任何类型的Python对象,特别是“复杂”的东西 - 任何类型的Python类,函数 - 任何类型的对象都可以!

它不仅限于像JSON这样的数据格式中提供的“list”,“dicts”,“strings”和“numbers”等相对简单的结构。

答案 2 :(得分:3)

这取决于你的用例。

如果您的文件相对较小且几乎是静态的,则YAML或JSON可以达到此目的。查看What is the difference between YAML and JSON? When to prefer one over the other了解详情

如果您的文件很大或是动态的,或者涉及到一些并发控制,那么您最好让数据库来处理它。

答案 3 :(得分:2)

我对几个应用程序有类似的需求,并使用jsonpickle确定了JSON。

为了使json输出更具人性化/可编辑性,我使用以下格式设置:

jsonpickle.set_encoder_options('simplejson', sort_keys=True, indent=4)

然后编码/解码数据:

text = jsonpickle.encode(data)
...
data = jsonpickle.decode(text)

关于jsonpickle的好处是,它允许您存储类对象,而无需手动将所有内容转换为dicts(就像使用普通JSON一样)。 jsonpickle还包括钩子,让你可以定义自己的转换器,如果你需要更多地控制事物的转换方式。

关系型数据库当然占有一席之地,特别是对于大型多人游戏;如果您的许多游戏逻辑涉及对大量对象的频繁小更新,则数据库方法将获胜。

[更新] 还有一点需要注意的是,如果您要对json文件进行大量手工编辑,请自行编写一些json-checker脚本,您可以在编辑后的文件上运行以查找语法错误,这样可以节省大量时间。

答案 4 :(得分:1)

如果您想要可编辑性,YAML是您命名的最佳选项,因为它没有<>或{}必需的分隔符。

答案 5 :(得分:1)

XML,JSON或YAML是比关系数据库提供的更“松散”的格式。关系数据库是面向表的,会对存储数据的方式施加一些约束。

根据您的描述,我会坚持使用JSON或YAML。使用它们,您可以表达相当复杂的对象图(如果您需要更多“正式”输入或模式,XML将是我的选择。)

对于读取或写入操作,通常考虑对对象进行序列化/反序列化(如http://docs.python.org/library/json.html那样)。

答案 6 :(得分:0)

我很想研究一些可以输出带注释的graphviz(DOT格式)的GUI,这样你就可以在它们之间创建房间和链接(一种图形)。然后,您可能需要另一种格式来支持更重要的信息。

但是应该可以轻松创建地图,房间之间的链接(包含项目或陷阱等),并且您可以使用公共库来生成png或其他地图的图形。

只是一个随意的想法 - 我可以随意忽略!