使用 pickle 模块存取 dict

Python 自带一个存取 dict 到二进制文件的工具 pickle, 支持数值型的 key (numpy.saveznumpy.savez_compressed 只支持字符串作为 key).

用法:

1
2
3
4
5
import pickle
# 存入
pickle.dump(data, open("filename.p", "wb")) # type(data): dict
# 读取
data = pickle.load(open("filename.p", "rb")) # 返回一个 dict

以下示例特地使用了数值型的 key:

1
2
3
4
5
6
7
8
9
>>> import pickle
>>> a = {1.1:1.1, 2:2} # 以 float 和 int 作为 key
>>> import pickle
>>> pickle.dump(a, open("data.p", "wb")) # 并不会自动添加后缀名
>>> b = pickle.load(open("data.p", "rb"))
>>> b.keys()
dict_keys([1.1, 2])
>>> b[1.1]
1.1

注意 pickle.load() 返回的类型是 dict, 但 numpy.load() 读取 '*.npz' 文件所返回是一个可以像 dict 一样使用 key 来索引数据的 numpy.lib.npyio.NpzFile 对象.

'*.p' 文件的大小和非压缩的 '*.npz' (numpy.savez()) 一致, 然而压缩过的 '*.npz' (numpy.savez_compressed()) 显然占用空间更小, 因此在方便的情况下 (例如 key 是字符串, 读取后直接操作数据而不需要得到一个 dict), 推荐优先使用 numpy.

如果要存入上述示例中同样的数据到 '*.npz' 格式, 需要转换 key 的类型 (读取时也需要使用字符串型的 key):

1
2
3
4
>>> a = {str(key):value for key, value in a.items()}
>>> a
{'1.1': 1.1, '2': 2}
>>> np.savez_compressed('data2', **a) # 会自动添加后缀名, 得到 'data2.npz'

其他数据存取教程: