您的位置:首页 > 文旅 > 旅游 > 【Python】存储字典的5种方法增量更新

【Python】存储字典的5种方法增量更新

2024/12/23 16:09:50 来源:https://blog.csdn.net/BeiErGeLaiDe/article/details/140747664  浏览:    关键词:【Python】存储字典的5种方法增量更新

四种常见的方法在这里:

【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 zipfilefrom numpy.lib import formatif not hasattr(file, 'write'):file = os.fspath(file)if not file.endswith('.npz'):file = file + '.npz'compression = zipfile.ZIP_STOREDif compress:compression = zipfile.ZIP_DEFLATED# compression = zipfile.ZIP_BZIP2zf = 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-10776format.write_array(fid, np.asanyarray(val), allow_pickle=allow_pickle, pickle_kwargs=pickle_kwargs)zf.close()

可以看到与np.savez()的代码原理一样,只不过我把两个函数集成到了一起,然后将zipfile的mode改成了'a',就可以支持增量更新了,需要什么其他功能可以继续修改该函数。

使用方法,demo:

import pickledef 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注释打开。

压缩后,读取全部数据需要的时间会多一些!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com