5

作为一个相对较新的程序员,我曾多次遇到这样的情况,即从外部源读取和组装程序数据而不是将其写入代码对我来说是有益的。当有大量相同类型的对象时,通常会出现这种情况。在这种情况下,对象定义会很快占用代码中的大量空间,并为可读性添加不必要的障碍。

例如,我一直在研究基于文本的 RPG,它有大量的房间和项目需要跟踪。即使是一些物品和房间也会导致大量的对象创建代码块。

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

什么格式最适合这个?我觉得像 SQL 这样的成熟数据库会给相当轻量级的脚本添加不必要的膨胀。另一方面,通过外部应用程序或其他 python 脚本编辑这些数据的简单方法很重要。在较轻的方面,我听到最常提到的几个是 XML、JSON 和 YAML。

从我所见,XML 似乎不是最佳选择,因为许多人似乎发现它复杂且难以有效使用。

JSON 和 YAML 似乎都可以工作,但我不知道在外部进行编辑会有多容易。在这种情况下,速度不是主要问题。虽然更快的实现当然是可取的,但这并不是我可以使用的限制因素。

我已经在这里和通过谷歌环顾四周,虽然我已经看到了很多关于这个主题的内容,但我找不到任何对我特别有帮助的东西。JSON 或 YAML 之类的格式是否足以满足此要求,或者我是否可以更好地使用成熟的数据库?

4

8 回答 8

5

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

于 2012-06-21T00:20:43.263 回答
4

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

Pickle 可以正确地序列化任何类型的 Python 对象,尤其是“复杂”的东西——任何类型的 Python 类、函数——任何类型的对象!

它不限于 JSON 等数据格式中可用的相对简单的结构,如“列表”、“字典”、“字符串”和“数字”。

于 2012-06-21T00:36:46.100 回答
3

好吧,这取决于您的用例。

如果您的文件相对较小且几乎是静态的,则 YAML 或 JSON 都可以达到目的。查看YAML 和 JSON 有什么区别?何时更喜欢其中一个以获取更多信息

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

于 2012-06-21T00:15:06.563 回答
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 脚本,您可以在编辑后的文件上运行以查找语法错误,它会为您节省很多的时间。

于 2012-06-21T01:10:30.940 回答
1

XML、JSON 或 YAML 是比关系数据库提供给您的更“松散”的格式。关系数据库是面向表的,并且会对您存储数据的方式施加一些限制。

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

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

于 2012-06-21T00:14:33.383 回答
1

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

于 2012-06-21T00:01:31.023 回答
0

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

但是应该可以很容易地创建地图,房间之间的链接(包含物品或陷阱等),并且您可以使用公共库以 png 或其他方式生成地图图形。

只是我脑海中的一个随机想法-随意忽略!

于 2012-06-21T00:37:02.833 回答
0

对于小型且封闭的回声系统,pickle是一个很好的解决方案。根据我的经验和 Ilia Zaitsev 的文章,一个更健壮、更快、更轻的文件,我建议将 pandas DataFrame 用于关系数据结构和pyarrow.feather用于读/写。

例如:

import pandas as pd
from dataclasses import make_dataclass
import pyarrow.feather as feather

Point = make_dataclass("Point", [('tag', str), ('x', float), ('y', float)])
df = pd.DataFrame([Point('tl', 1.0, 1.0), Point('br', 3.0, 4.0)])
feather.write_feather(df, '/tmp/point_data.arrow)
于 2021-08-22T12:12:22.397 回答