1

我是一名非程序员,从事简单的 Python 编程,以便在工作中自动执行与 GIS 相关的任务。然而,我发现我真的很喜欢它,并且在工作之外“扩展”了我的技能。

我目前正在使用 Pickle 模块来保存类实例,并意识到我有一些用于构建保存数据的选项。我的问题涉及哪个选项是“更好”或更“可接受/最佳实践”选项,或者是否有更好的选项。

我将使用“playstation-esque”示例,只是为了好玩:

有多个用户。每个用户都有一组特定游戏的奖杯。每个用户也可能有多个特定游戏的玩家档案,每个角色都可以保存多个游戏实例。

因此,当有人登录时,他们会从已保存的用户对象列表中选择他们是哪个用户(或创建一个新用户对象 - 但现在我将忽略创建新场景)。根据您登录的用户,可以从保存文件以及与该用户关联的任何播放器配置文件中加载适当的奖杯对象。当用户去加载保存的游戏时,他们会选择适当的玩家资料,并且可以列出与该角色相关的适当的保存游戏信息。用户将选择他们想要的保存,然后将加载游戏数据。

在我看来,我有几个选择:

1)根据类分离保存文件。前任:

A) "users" - this could contain a list of the User() objects
B) "<username>_trophies" - this could contain a list of the Trophy() objects assotiated with the user indicated in the filename
C) "<username>_characters" - this could contain a list of the Player() objects assotiated with the user indicated in the filename
D) "<username>_<charactername>_save<#>" - this could contain a save of the game info (probably as a dictionary with various info) assotiated with the username and charactername indicated in the filename

使用此设置,每个文件都可以根据需要取消腌制,因此如果用户从不选择查看他们的奖杯,则无需加载奖杯信息。

但是,我想知道这是否会破坏它太多并创建太多文件。使用此选项会更好吗?:

2) 拥有一个全面的保存文件,其中包含字典形式的所有信息。例如:

{User:[[Trophy,Trophy,Trophy], {Character: [(game info),
                                            (game info),
                                            (game info)];
                                Character:  [(game info),
                                            (game info),
                                            (game info)]}];
 User:[[Trophy,Trophy,Trophy], {Character: [(game info),
                                            (game info),
                                            (game info)];
                                Character:  [(game info),
                                             (game info),
                                             (game info)]}]}

那么这些中哪个“更好”?都好吗?两者都不?

感谢任何和所有的帮助/意见!

4

2 回答 2

1

关于保存任何类型的信息的关键之一是一致性。除非您有大量数据,否则文件系统的性能通常不是问题,因为文件系统缓存意味着您很少在磁盘本身上等待。

我认为在这种应用程序中拆分数据不会有任何好处,而且它们“不同步”的可能性很高。我强烈建议将内容放在一个文件中。

至于“更好的选择”选项,我建议查看 sqlite3 模块(http://docs.python.org/2/library/sqlite3.html) - 许多应用程序(来自时间跟踪器,请注意takers 等到 web 浏览器)使用 sqlite 数据库来存储他们的配置,其中一个很棒的事情是只有一个包含数据的文件,可以很容易地移动、备份等(需要注意的是使用时不应移动/备份!)

您可能还想查看 json 模块,它具有与 pickle 模块(load/loads/dump/dumps)类似的接口,但它写入的文件在很大程度上是人类可读和可修改的。缺点是只能存储基本类型(字符串、布尔值、数字)以及这些简单类型的列表和字典。

于 2013-11-05T23:21:46.923 回答
0

如果当时是一个用户,那么您可以将所有内容放入单个文件中。这将是最容易实施的选项。

当用户数量增加时,您会发现从多个进程更改单个文件将不起作用。两个进程读取文件,在内存中更改它并写回磁盘。只有最后保存的更改才会保留。因此,您自然会将数据拆分为不同的文件。

但是同样的问题也可能发生在每个用户实现的文件中。然后,您应该研究其他类型的存储,例如数据库。

于 2013-11-05T23:21:15.123 回答