保存文件的最佳实践 - Python pickle 用例



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

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

我将使用一个"Playstation式"的例子,只是为了踢球:

有多个用户。每个用户都有一组特定游戏的奖杯。每个用户可能还具有特定游戏的多个玩家配置文件,并且每个角色都可以有多个保存的游戏实例。

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

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

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)]}]}

那么这些中哪一个"更好"呢?要么可以吗?也不?

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

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

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

至于"更好的选项"选项,我建议查看sqlite3模块(http://docs.python.org/2/library/sqlite3.html) - 许多应用程序(从时间跟踪器,笔记记录器等到Web浏览器)使用sqlite数据库来存储其配置,它的一大优点是只有一个包含数据的文件,可以轻松移动, 备份等(需要注意的是,使用时不应移动/备份!

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

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

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

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

最新更新