如何用Python保存数据?

时间:2009-09-07 14:49:23

标签: python data-structures save

我正在开发一个Python程序,希望用户能够保存他们正在处理的数据。我看过cPickle;它似乎是一种快速简便的数据保存方式,似乎不安全。由于可以腌制整个函数,类等,我担心流氓保存文件会将有害代码注入程序。有没有办法可以阻止这种情况,或者我应该考虑其他保存数据的方法,例如直接转换为字符串(也似乎不安全)或创建XML层次结构,并将数据放入其中。

我是python的新手,所以请耐心等待。

提前致谢!

编辑:至于我存储的数据类型,主要是字典和列表。名称,速度等信息现在相当简单,但将来可能会变得更加复杂。

7 个答案:

答案 0 :(得分:22)

根据您的描述,JSON编码是安全且快速的解决方案。 python2.6中有一个json模块,你可以像这样使用它:

import json
obj = {'key1': 'value1', 'key2': [1, 2, 3, 4], 'key3': 1322}
encoded = json.dumps(obj)
obj = json.loads(encoded)

JSON格式是人类可读的,与python中的字典字符串表示非常相似。而且没有像泡菜这样的安全问题。如果你没有python2.6,你可以安装cjson或simplejson

你不能使用JSON来保存像Pickle这样的python对象。但是你可以用它来保存:字符串,词典,列表......对大多数情况来说就足够了。

解释为什么pickle不安全。来自python docs

  

大多数安全问题   周围的咸菜和cPickle   模块涉及unpickling。有   没有已知的安全漏洞   与酸洗有关,因为你(   程序员)控制那些对象   泡菜将与之相互作用   produce是一个字符串。

     

然而,对于unpickling,它从不 a   好主意去挑选一个不受信任的人   字符串的起源是可疑的   例如,从套接字读取的字符串。   这是因为unpickling可以创建   意外的对象,甚至   可能运行那些方法   对象,例如他们的类   构造函数或析构函数   ...... 故事的寓意就是你   应该非常小心   你申请的字符串的来源   unpickles

有一些方法可以保护自己,但在你的情况下使用JSON要容易得多。

答案 1 :(得分:3)

您可以执行以下操作:

  • 味酸
  • 签署腌制文件
  • 完成

阅读

  • 检查腌制文件的签名
  • Unpickle
  • 使用

我想知道是什么让你认为数据文件会被篡改但你的应用程序不会被篡改?

答案 2 :(得分:1)

在我们回答之前,你需要给我们更多的背景信息:你节省了什么类型的数据,有多少数据,你想如何访问它?

至于泡菜:它们不存储代码。当你挑选一个函数或类时,它是存储的名称,而不是实际的代码本身。

答案 3 :(得分:1)

*****在这个答案中,我只关心应用程序完整性的意外损坏。*****

Pickle是“安全的”。可能不安全的是访问您未编写的代码,例如在插件中;但这与泡菜无关。

当你挑选一个对象时,它的所有数据都会保存,但代码和实现却没有。这意味着当unickled,更新的对象可能会发现它内部有“旧式”数据(如果您更新实现)。如果适用,这是您必须知道和处理的事情。

酸洗字符串,列表,数字,字符串非常简单且完美,并且与JSON相当。 Pickle的魔力是 - 有时没有调整 - 甚至可以腌制复杂的python对象。但只有数据被腌制;只需通过保存的模块名称和对象的类型名称重建实例。

答案 4 :(得分:1)

您应该使用某种数据库。以泡菜形式存储不是一个好主意(在大多数情况下)。你可以考虑:

  • SQLite - (包含在Python 2.5+中)快速而简单,但需要了解SQL和DB-API
  • buzhug - 使用pythonic语法的非SQL,基于文件的数据库
  • SQL数据库 - 您可以使用某些DBMS(如MySQL,PostreSQL等)的接口,但它只适用于大量数据(数千条记录)。

您可以找到其他一些解决方案here

答案 5 :(得分:1)

谁 - 特别是 - 正在通过黑客攻击腌制文件来破解计划的反社会人士?

这是Python。反社会有你的来源。他们不需要愚弄你的腌菜文件。他们只需编辑您的来源并完成他们想要的所有“伤害”。

除非你参与有组织犯罪集团的诉讼,否则不要担心“不安全”。

不要担心“恶意保存文件会将有害代码注入程序”。当有源时,没有人会为流氓保存文件而烦恼。

答案 6 :(得分:1)

您可能喜欢使用y_serial模块 http://yserial.sourceforge.net

它读起来像一个教程,但在操作上提供 序列化和持久性的工作代码。 评论讨论了一些优点和缺点 与此处提出的问题有关。

它旨在成为一个通用的解决方案 使用SQLite存储压缩的Python对象 (几乎没有SQL烦恼; - )

希望这有帮助。