我想做的就是序列化和反序列化字符串或整数元组。
我查看了pickle.dumps(),但字节开销很大。基本上它看起来占用了大约4倍的空间。此外,我需要的只是基本类型,不需要序列化对象。
marshal在空间方面稍好一些,但结果却充满了令人讨厌的\ x00字节。理想情况下,我希望结果是人类可读的。
我想过只使用repr()和eval(),但是有一种简单的方法可以在不使用eval()的情况下实现这一点吗?
这将存储在数据库中,而不是文件中。字节开销很重要,因为它可以在需要TEXT列和varchar之间产生差异,通常数据紧凑性会影响db性能的所有区域。
答案 0 :(得分:13)
看看json,至少生成的dumps
可以与许多其他语言一起使用。
JSON(JavaScript Object Notation)http://json.org是JavaScript语法的一个子集(ECMA-262第3版),用作轻量级数据交换格式。
答案 1 :(得分:8)
我个人会使用yaml。它与json的编码大小相同,但它可以在必要时代表一些更复杂的东西(例如类,递归结构)。
In [1]: import yaml
In [2]: x = [1, 2, 3, 'pants']
In [3]: print(yaml.dump(x))
[1, 2, 3, pants]
In [4]: y = yaml.load('[1, 2, 3, pants]')
In [5]: y
Out[5]: [1, 2, 3, 'pants']
答案 2 :(得分:8)
也许你没有使用正确的协议:
>>> import pickle
>>> a = range(1, 100)
>>> len(pickle.dumps(a))
492
>>> len(pickle.dumps(a, pickle.HIGHEST_PROTOCOL))
206
请参阅pickle data formats的文档。
答案 3 :(得分:6)
答案 4 :(得分:1)
python documentation中提到了一些持久性内置函数,但我认为在生成的文件大小中,这些内容并不显着。
你总是可以使用configparser,但你只能得到string,int,float,bool。
答案 5 :(得分:0)
“字节开销很大”
为什么这很重要?它完成了这项工作。如果你的磁盘空间不足,我很乐意以500美元的价格卖给你1Tb。
你运行它吗?性能是一个问题吗?你能证明序列化的表现是 问题吗?
“我想过只使用repr()和eval(),但是有一种简单的方法可以在不使用eval()的情况下实现这一点吗?”
没有什么比repr和eval简单。
eval有什么问题?
是“有人可以将恶意代码插入我序列化列表的文件中”问题吗?
谁 - 具体 - 是要查找和编辑此文件以存入恶意代码?你为确保这一点而做的任何事情(即加密)都会从中删除“简单”。
答案 6 :(得分:-1)
幸运的是有解决方案使用COMPRESSION并解决 涉及任意Python对象的一般问题 包括新课程。而不是微观管理 元组有时最好使用DRY工具 您的代码将更加清晰,易于重构 在类似的未来情况下。
y_serial.py module ::使用SQLite的仓库Python对象
“序列化+持久性::在几行代码中,将Python对象压缩并注释为SQLite;然后通过关键字按时间顺序检索它们,而不使用任何SQL。最有用的”标准“模块,用于存储无模式数据的数据库。“
http://yserial.sourceforge.net
[如果你仍然担心,为什么不坚持这些元组 字典,然后将y_serial应用于字典。 由于透明,可能任何开销都会消失 zlib在后台压缩。]
关于可读性,文档还提供了详细信息 为什么选择cPickle而不是json。