保存文件的最佳实践 - python pickle 用例
Posted
技术标签:
【中文标题】保存文件的最佳实践 - python pickle 用例【英文标题】:Best Practices for Save Files - a python pickle use case 【发布时间】:2013-11-05 23:00:15 【问题描述】:我是一名非程序员,从事简单的 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)]]
那么这些中哪个“更好”?都好吗?都没有?
感谢所有帮助/意见!
【问题讨论】:
您需要并发访问数据吗?您预计总共有多少用户? 目前这仅适用于我,用于学习目的,因此“在现实世界中”用户的数量将是一个,或者我为测试/学习目的而创建的用户数量。但我认为“假装”它是为了更多地为了学习如何以“正确”的方式去做,这永远不会有坏处。 【参考方案1】:关于保存任何类型的信息的关键之一是一致性。除非您有大量数据,否则文件系统的性能通常不是问题,因为文件系统缓存意味着您很少在磁盘本身上等待。
我认为在这种应用程序中拆分数据不会有任何好处,而且它们“不同步”的可能性很高。我强烈建议将内容放在一个文件中。
至于“更好的选择”选项,我建议查看 sqlite3 模块 (http://docs.python.org/2/library/sqlite3.html) - 许多应用程序(从时间跟踪器、笔记记录器等到 Web 浏览器)使用 sqlite 数据库来存储他们的配置,其中一个很棒的事情是只有一个包含数据的文件,可以很容易地移动,备份等(需要注意的是它不应该被移动/备份时使用!)
您可能还想查看 json 模块,它具有与 pickle 模块 (load/loads/dump/dumps) 类似的接口,但它写入的文件 - 在很大程度上 - 是人类可读和可修改的。缺点是只能存储基本类型(字符串、布尔值、数字)以及这些简单类型的列表和字典。
【讨论】:
感谢两位的回答!【参考方案2】:如果当时只有一个用户,那么您可以将所有内容放入单个文件中。这将是最容易实施的选项。
当用户数量增加时,您会发现从多个进程更改单个文件将不起作用。两个进程读取文件,在内存中更改它并写回磁盘。只有最后保存的更改才会保留。因此,您自然会将数据拆分到不同的文件中。
但同样的问题也可能发生在每个用户实现的文件中。然后你应该研究一下其他类型的存储,比如数据库。
【讨论】:
感谢两位的回答!以上是关于保存文件的最佳实践 - python pickle 用例的主要内容,如果未能解决你的问题,请参考以下文章