【发布时间】:2011-01-19 15:40:45
【问题描述】:
如果我有一个充满嵌套内容的字典,我如何将它作为字符串存储在数据库中?然后,当我准备好解析时,将其转换回字典?
编辑:我只想将其转换为字符串...然后再转换回字典。
【问题讨论】:
标签: python database string list dictionary
如果我有一个充满嵌套内容的字典,我如何将它作为字符串存储在数据库中?然后,当我准备好解析时,将其转换回字典?
编辑:我只想将其转换为字符串...然后再转换回字典。
【问题讨论】:
标签: python database string list dictionary
选项:
1) 酸洗
2) XML
3) JSON
其他我确定。可移植性对您的意义有很大关系。
【讨论】:
你为什么不使用pickle模块的一些序列化/反序列化?
【讨论】:
最好,在您规定的条件下:
import cPickle
...
thestring = cPickle.dumps(thedict, -1)
-1 确保最有效的序列化并生成 binary 字符串(任意字节字符串)。如果你需要一个 ascii 字符串(因为例如一些 Unicode 转码将会发生并且你不能将字段的类型从 TEXT 切换到 BLOB),避免使用 -1 ,但你的效率会降低。
以后要从字符串中取回dict,无论哪种情况,
thenewdict = cPickle.loads(thestring)
【讨论】:
utf-8 在键和值中都很好,但不能保证thestring 会尊重utf-8 编码(很可能不会:它只是字节!)。如果这是一个问题,您必须省略 -1 参数(“执行最快、最有效和最简洁的序列化”是 不是默认值但需要显式 -1.. . 实际上有多种原因,但这是其中之一;-)。
__slots__ 但不定义__getstate__ 的对象),那么旧的遗留协议(您会得到什么)避免-1 很好)。
有许多序列化方法,JSON 可读、相当紧凑、本机支持且可移植。我更喜欢它而不是 pickle,因为后者可以执行任意代码并可能引入安全漏洞,并且因为它的可移植性。
根据您的数据布局,您还可以使用 ORM 将数据直接映射到数据库结构中。
【讨论】:
你有两个选择
使用标准的序列化格式(json、xml、yaml、...)
使用 cPickle:
【讨论】: