如何用Python保存数据?

pra*_*mic 14 python save data-structures

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

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

提前致谢!

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

Nad*_*mli 23

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

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

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

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

解释为什么泡菜不安全.从python 文档:

pickle和cPickle模块周围的大多数安全问题涉及unpickling.没有已知的与酸洗相关的安全漏洞,因为您(程序员)控制pickle将与之交互的对象,并且它生成的所有对象都是字符串.

但是,对于unpickling,对unpickle一个不可信的字符串绝不是一个好主意,该字符串的来源可疑,例如,从套接字读取的字符串.这是因为unpickling可以创建意外的对象,甚至可能运行这些对象的方法,例如它们的类构造函数或析构函数...... 故事的寓意是你应该非常小心应用程序的字符串来源.

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

  • @ kaizer.se:OP担心安全问题.他说:"我担心流氓保存文件会在程序中注入有害代码." (6认同)
  • 当然它不太安全:"pickle模块并不是为了防止错误或恶意构造的数据.绝不要取消从不受信任或未经验证的来源收到的数据." 来自python docs http://docs.python.org/library/pickle.html (5认同)

Ned*_*der 1

在我们回答之前,您需要向我们提供更多背景信息:您要保存什么类型的数据、有多少数据、您想如何访问它?

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