自学内容网 自学内容网

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

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


原文地址:https://blog.csdn.net/BeiErGeLaiDe/article/details/140747664

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!