引言
如果要将下面这个数据序列化后存入磁盘
import numpy as np
data = {
'n': None, 't': True, 'f': False,
'l': [1, 2, 3],
'd': {
'a': 1, 'b': 2},
'np': [np.array([1, 2]),
np.array(['a', 'b'])]
}
有些人图省事,直接用str
转化为字符串,没有考虑以后怎么还原的问题
s = str(data)
s
# "{'n': None, 't': True, 'f': False, 'l': [1, 2, 3], 'd': {'a': 1, 'b': 2}, 'np': [array([1, 2]), array(['a', 'b'], dtype='<U1')]}"
当我们拿到这样的字符串想要还原python对象时,就会比较棘手。本文将将介绍两种方式对这种字符串进行还原,最后给出更好的序列化方式。本文分为如下几个部分
eval
法还原json
法还原- array 的
json
序列化方法
其中json
法还原部分涉及较复杂的正则表达式和json模块的细节与进阶内容,对于想熟悉这两部分操作的读者来说,是个不错的练习题目。
eval
法还原
"{'n': None, 't': True, 'f': False, 'l': [1, 2, 3], 'd': {'a': 1, 'b': 2}, 'np': [array([1, 2]), array(['a', 'b'], dtype='<U1')]}"
看到这样的字符串,我最初不知道这个字符串是用str
生成的,因此我脑中第一反应是用json
来还原,但由于array
的存在,这个还原方法有些复杂,所以我开始寻求他法。
这时,我看array([1, 2])
觉得很眼熟,就回想什么时候数组会用这种形式展示,这让我想到了str
。而str
序列化后的字符串,一般可以用eval
进行还原,如下所示
s = "{'n': None, 't': True, 'f': False, 'l': [1, 2, 3], 'd': {'a': 1, 'b': 2}}"
eval(s)
# {'n': None, 't': True, 'f': False, 'l': [1, 2, 3], 'd': {'a': 1, 'b': 2}}
但有array
,直接这样做就不行。eval
处理不了array
ÿ