我最近发现了YAML,它已经证明是我项目的一种奇妙的格式(我正在创建一个基于文本的RPG)。它正在处理我需要完美无缺的一切 - 区域文件(带有descs,exits,objs,npcs等的房间),脚本文件,npc文件,目标文件......它可以解决所有问题!只有一件事......
当更新这些文件中的值时,我当然需要将它们写回磁盘以保留更改。不幸的是,YAML的dump()
方法真的让事情搞得一团糟。首先它按字母顺序排列所有键,然后它似乎每行放一个k:v对。这有效地采用了5行文件并将其转换为94行。
我尝试使用write()
将YAML对象写回磁盘,但它会抛出
对我说。 Pickle会保存它,但我认为这会破坏数据的YAML-ness。有没有一个很好的方法来保存没有TypeError:期望一个字符缓冲区对象
dump()
的YAML对象?我听说过提到SQLite,它会和YAML一样吗?我几乎没有数据库经验,但似乎YAML对象基本上是数据库。是否值得重新编码所有使用SQLite的代码?与我现在遇到的问题不同,用它保存更改的值是否容易?
这里的任何帮助都会很棒。我非常喜欢YAML。我挣扎了很长一段时间试图找到一种方法来存储我游戏所需的所有数据,当我发现YAML时,就好像它充满了圣洁的光芒,因为天使的合唱在它上面唱出了他们的荣耀 - 所以你可以理解如果我首先想知道一种在不使用dump()
的情况下将YAML数据保存到磁盘的方法。如果没有,建议表示赞赏!
答案 0 :(得分:1)
YAML是一种在Python和文本可编辑格式之间对字典和列表进行序列化和反序列化的方法。它不适合存储丰富的数据,多用户访问,快速查找数据,保证数据完整性以及使数据库成为数据库的所有其他因素。
您使用YAML作为数据库,但它不是数据库。例如,密钥的重新排序是key: value
对被表示为Python字典的事实,这本质上是无序的。
你肯定需要花一些时间来学习数据库。
SQLite是一个很好的起点。你也可以看看Postgres或MySQL。您可能希望阅读一些初学者的SQL指南以及使用Python进行数据库访问。网上有很多。
答案 1 :(得分:0)
可以使用YAML和Python保留顺序。
Python有OrderedDict,YAML有一个名为omap的等效有序映射。
不幸的是,当您使用YAML转储OrderedDict时,它会尝试保留OrderedDict python对象类型,而不是将其转换为YAML omap。这部分是因为YAML规范意味着可以使用过多的语言,从技术上讲,YAML地图或omap允许重复的密钥,我相信(我必须重新研究它,但我看到它被引用为YAML和JSON之间的“关键”区别 - YAML声明它如何处理JSON没有的重复键。)
无论如何,有一种方法可以告诉YAML将数据加载到OrderedDict中并将OrderedDict顺序地转储到map或omap中。我找到的最简洁的来源是py-lessly。虽然网络上还有其他一些实现。我也喜欢将py-lessly代码转储到一个简单的yaml映射,它不需要每个字典旁边的!! omap - 让YAML保持漂亮!
还有layered-yaml-attrdict-config将YAML数据加载到名为AttrDict的OrderedDict子类中,并带有一些额外的功能。我不得不在这个实现中添加一些东西来为我工作 - 我认为它在转储时丢失了顺序,所以我从无实现的实现中添加了代码。我还想使用组合的dict和list结构,并且必须编写一些额外的代码来递归地将AttrDict应用于整个数据结构。
从这些示例中,您可以看到如何使用YAML处理有序映射。我正在努力为应用程序设置实现这一点,我希望保持相对人类可读性,以及哪个顺序很重要。