2011-04-01 96 views
1

我最近发现了YAML,它已成为我的项目(我正在创建一个基于文本的RPG)的奇妙格式。它可以完美地处理我需要的所有东西 - 区域文件(带有descs,exits,objs,npcs等的房间),脚本文件,npc文件,目标文件......它可以解决所有问题!只有一件事...我不喜欢“yaml.dump()”如何保存它的文件。有其他选择吗?

当更新这些文件中的值时,我当然需要将它们写回磁盘以保持更改。不幸的是,YAML的dump()方法真的让事情变得糟糕。首先,它将所有关键字按字母顺序排列,然后每行显示一个k:v对。这有效地采用了5行文件并将其转换为94行。

我试着写的用write()的YAML对象回盘,但它抛出

TypeError: expected a character buffer object

我。 Pickle会保存它,但我认为这会破坏数据的YAML性。没有dump()保存YAML对象的好方法吗?我听说过SQLite,它的工作原理和YAML一样吗?我几乎没有数据库的经验,但似乎YAML对象基本上是数据库。值得使用SQLite重新编码所有东西吗?与我现在遇到的问题不同,用它保存更改后的值是否容易?

这里的任何帮助将是伟大的。我非常喜欢YAML。我努力寻找一种方法来存储我游戏所需的所有数据,并且当我发现YAML时,它好像闪耀着神圣的光芒,就像天使的合唱团唱着它们的荣耀 - 所以你可以理解如果我首先想知道如何在不使用dump()的情况下将YAML数据保存到磁盘。如果没有,建议表示赞赏!

回答

1

YAML是一种对Python和文本可编辑格式之间的字典和列表进行序列化和反序列化的方式。它不适合存储丰富的数据,多用户访问,快速查找数据,保证数据完整性以及使数据库成为数据库的所有其他事情。

您正在使用YAML作为数据库,但它不是数据库。例如,密钥的重新排序是key: value对表示为Python字典的事实,它本质上是无序的。

你肯定需要花一些时间学习一些关于数据库的知识。

SQLite是一个很好的开始任何地方。你也可以看看Postgres或MySQL。您可能会想要阅读一些初学者的SQL指南以及使用Python进行数据库访问。网上有很多。

+0

但是,这不是问题。 YAML非常适合以可读格式存储数据。一旦你加载了它,你就拥有本地Python数据结构,因此比任何数据库都能以更快的速度访问内存。当数据无法一次存储在内存中时,数据库会赢。 – delnan 2011-04-01 13:45:24

+0

我检查了几个关于Python中SQLite的vids,看起来好像有很多东西要学习这条路线。我遇到的唯一问题是它可能会暂停我的进步。但是,看起来它可能比简单访问2d字典对象更强大。数据库比YAML要慢多少?如果说我在一个数据库中映射了一个区域,其中每行包含该区域中一个房间所需的全部数据,并且有50个房间,那么它真的会很慢吗? – 2011-04-01 15:31:30

+0

数据库通常应该比YAML更快,因为涉及的字符串处理会更少(但这取决于您设计DB结构的程度) – ncoghlan 2011-04-01 18:06:19

0

可以使用YAML和Python保存顺序。

Python的OrderedDict和YAML有一个等效的有序映射,名为omap

不幸的是,当您使用YAML转储OrderedDict时,它会尝试保留OrderedDict python对象类型,而不是将其转换为YAML omap。这部分是因为YAML规范是为了适应大量的语言,从技术上来说,YAML映射或omap允许重复的键,我相信(我不得不重新研究它,但是我已经看到它被引用为YAML和JSON之间的“关键”区别--YAML声明它如何处理JSON不重复的键)

总之,有一种方法可以告诉YAML将数据加载到OrderedDict中并将OrderedDict顺序转储转换成地图或omap。我发现的最简洁的来源是py-lessly。虽然网络上还有其他一些实现。我也喜欢py-lessly代码转储到一个简单的yaml映射,它不需要!! omap在每个字典旁边 - 保持YAML漂亮!

还有layered-yaml-attrdict-config它将YAML数据加载到名为AttrDict的OrderedDict子类中,并带有一些附加功能。我不得不在这个实现中添加一些东西来为我工作 - 我认为它在转储时失去了顺序,所以我从无所事事的实现中添加了代码。我也想使用组合字典和列表结构,并且必须编写一些额外的代码来递归地将AttrDict应用于整个数据结构。

从这些示例中,您可以看到如何使用YAML处理有序映射。我目前正致力于实现这个应用程序设置,我想保持相对人性化的可读性和重要性。

相关问题