四种常见的方法在这里:
【Python】存储字典的四种方法_python 存储字典-CSDN博客
但是,有个问题:使用上面的几种常见方法,每次更新数据只能全部载入,然后添加数据后再全部覆盖写入到硬盘。文件小的时候还好,如果文件较大,读取写入都要花上一些时间,且对硬盘寿命不友好。
我尝试过使用h5来保存字典,将数据转为DataFrame后.tohdf()。但是得到的文件非常大,没有继续研究。
这里另外提供一种可以增量更新的方法:
简单来说就是模仿np.savez()的代码逻辑,使用zipfile将字典数据保存为npz,支持增量更新,支持数据压缩,支持选择性读取,也可以使用dict()将全部数据载入为dict格式。下面是对应的函数代码:
def save_zip(file, data_dict, compress=False, allow_pickle=True, pickle_kwargs=None):
"""
the `file` argument can accept file, str, or pathlib.Path objects.
"""
import zipfile
from numpy.lib import format
if not hasattr(file, 'write'):
file = os.fspath(file)
if not file.endswith('.npz'):
file = file + '.npz'
compression = zipfile.ZIP_STORED
if compress:
compression = zipfile.ZIP_DEFLATED
# compression = zipfile.ZIP_BZIP2
zf = zipfile.ZipFile(file, mode="a", compression=compression, allowZip64=True)
for key, val in data_dict.items():
with zf.open(key + '.npy', 'w', force_zip64=True) as fid: # always force zip64, gh-10776
format.write_array(fid, np.asanyarray(val), allow_pickle=allow_pickle, pickle_kwargs=pickle_kwargs)
zf.close()
可以看到与np.savez()的代码原理一样,只不过我把两个函数集成到了一起,然后将zipfile的mode改成了'a',就可以支持增量更新了,需要什么其他功能可以继续修改该函数。
使用方法,demo:
import pickle
def save_zip():
pass
# Load pickle dict data
path = 'data_dict.pkl'
data_dict = pd.read_pickle(path)
# Save to npz
save_path = 'data_dict.npz'
save_zip(save_path, data_dict, compress=True)
# Load npz
npz_obj = np.load(save_path )
print(npz_obj[key])
# Convert to dict
data_dict1 = dict(npz_obj)
如果不嫌保存的文件大一点,可以设置compress=False。如果想要压缩到更小,可以将save_zip函数中的compression = zipfile.ZIP_BZIP2注释打开。
压缩后,读取全部数据需要的时间会多一些!