独立 python 应用程序的数据存储
Posted
技术标签:
【中文标题】独立 python 应用程序的数据存储【英文标题】:Data storage for standalone python application 【发布时间】:2019-01-23 10:03:25 【问题描述】:我想制作一个 python 程序(带有 PyQt GUI,但我不知道这是否相关),即使程序关闭也必须保存一些我想要存储的信息。我要存储的信息示例:
用户可以在文件对话窗口中搜索文件。我想在以前使用的目录中启动文件对话窗口,即使程序在文件搜索之间关闭。
用户可以输入他们自己的类别来对项目进行排序,建立在我的一些预定义类别之上。这些新类别应该会在程序下次启动时提供。
现在我想知道存储此类信息的正确方法是什么。我应该用泡菜吗?一个合适的数据库(我知道一点 sqlite3,但必须阅读)?我自己解析的简单文本文件?对于示例 1 中的数据是一回事,对于示例 2 中的数据是另一回事。?
另外,无论我用什么方式存储它,我应该把那个文件放在哪里?
我在上下文中询问我可能希望稍后将我的程序作为独立应用程序提供给其他人使用(使用 py2app、py2exe 或 PyInstaller)。
现在我只是在我的 .py 文件所在的目录中保存一个 pickle 文件,例如 this answer reconmends,但答案还特别提到:
对于个人项目可能就足够了。
(强调我的)
如果我想将程序作为独立应用程序提供给其他人使用,那么使用 pickle 也是“正确、专业”的方式吗?
【问题讨论】:
SQLite 可能是一个更好的解决方案。你可以在这里查看:sqlite.org/index.html 我投票结束你的问题主要是基于意见 - 并不是说这本身就是一个坏问题,而是你唯一的标准 - “正确的专业方式” - 无法量化,也没有基于此标准的答案只有事实才能证明。实际上,我自己对“正确的专业方式”的定义是“可靠地完成工作的最简单的解决方案”,所以我真的不会在这里将 sqlite 视为“正确的专业方式”。对于您的需要,仅 json 文件似乎是一个非常明显的选择。 注意:如果您必须处理更大的关系数据集并且不想依赖外部 rdbms,那么 sqlite 将是一个不错的选择。 @brunodesthuilliers,我明白为什么你会在这种情况下投票关闭它,但作为需要持久数据的新手,我不知道没有一些“正确、专业”的方式,在一些我不知道的样式指南/编码约定中定义。 嗯,实际上“专业”仅意味着您可以为您的工作获得报酬 - 它并没有说明您的工作质量,我可以告诉您大量的“专业”代码我看到绝对不是“适当的”。不,对于这样的设计选择,没有“样式指南”或“编码约定”(两者都是纯粹的任意规则 FWIW)。充其量是“良好实践”,主要包括选择健壮的、经过验证的、稳定的、众所周知的、维护良好的以及尽可能与语言无关的东西。当然也适用于您的用例。 【参考方案1】:选择取决于您存储数据的方法,哪种方法是您的?:
用户应该能够在不使用我的程序的情况下对其进行更改 应防止用户使用我的程序以外的程序对其进行更改如果首先您可能会考虑部署 JSON 开放标准文件格式,Python 已经为此准备好了名为 json 的库。实际上,您会得到 人类可读的 并且可以在文本编辑器中编辑的文本(您可以将其保存到文件中)。此外,还有 JSON 文件查看器和编辑器,可以更轻松地查看/编辑 JSON 文件。
【讨论】:
这是我没有考虑过的事情,但确实值得牢记:我是否希望人们能够阅读和编辑存储的数据?如果用户以某种方式操作文件会导致意外行为...... 我选择这个作为我接受的答案。在 brunodesthuilliers cmets 之后,我认为 json 文件和 sqlite db 都是“正确”的方法,但我会使用 JSON 文件,因为它(对我来说)更容易实现,并且用户可以编辑它自己更容易,例如他们更喜欢通过编辑 JSON 文件而不是在程序中添加类别。【参考方案2】:正如摩尔多瓦所说,我认为 SQLite3 在这种情况下是更好的解决方案。
pickle有一个问题,有时pickle格式可以跨python版本改变,使用sqlite3有更大的优势。
【讨论】:
好的,但是如果我将脚本捆绑为一个独立的应用程序,那么如果 pickle 跨版本更改真的很重要吗?另外,您能否详细说明使用 sqlite3 的其他更大优势?以上是关于独立 python 应用程序的数据存储的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Azure Blob 存储容器挂载为在 Python 中以独立模式在本地运行的 Spark 作业的目录?