用npz文件对代码定点存储数据并读取

对于运行时间比较长的代码,每隔一定步长进行存储。

本来是想用python写日志的方式,后来看了一下好像和需求不一致。

这里是利用np.savez存储成numpy数据,数据类型是npz

import numpy as np
import os

# 新建存储文件夹,看起来整齐一些
file_path = os.path.join("file_path")
os.makedirs(file_path, exist_ok=True)


a = np.array([1, 2, 3])
b = np.array([1, 4, 5])

# ....存储条件判断达到后
name = "file_name.npz"
file_name = os.path.join(file_path, name)
np.savez(file_name, a=a, b=b)

在需要读取时

with np.load(file_name) as data:
    a = data["a"]
    b = data["b"]

# 也可以用下面的方式,读取的文件字典形式的

data = np.load(file_name)
a = data["a"]
b = data["b"]

探索出来的trick:

不止是numpy类型数据可以用这个方法存储,np对数据的兼容性很好。在用parser包输入参数时,也可以把参数批量的用这个方法存储到一个npz文件中,这时的参数。

import parser
import numpy as np

parser = argparse.ArgumentParser()
parser.add_argument('-n', default=1, type=int)
parser.add_argument('-pn', default=400, type=int)
    
args = parser.parse_args()

a=np.array([1,2,3])

# 设置存储条件和路径
np.savez(file_name, a=a, inf=args)

args本来是Namespace(n=1, pn=400),在存储时被作为object array。

恢复时可以直接用tolist()转,就是元素本身。(这个用tolist转换过就是原本的元素,还挺惊喜的)

data = np.load(file_name,allow_pickle=True)
inf = data['inf'].tolist()
inf.pn    # 输出400

说明:

用np.savez保存的文件是如果原文件存在就覆盖,对于这里是适用的,也就是随着运行不断更新最新的数据,丢掉之前的数据。

如果需要保存之前的数据,可以在name中加入步长等factor,这里需要格式和日期的一些运用命名。

格式命名详见 https://www.cnblogs.com/vamei/archive/2013/03/12/2954938.html

关于时间日期的time包 https://blog.csdn.net/shomy_liu/article/details/44141483

此外需要文件路径和文件操作的一些辅助,os包,详见https://www.jianshu.com/p/86f88b3d7efd

可能的报错:

  • 在读文件时如果有object 类型的文件,那么需要设置allow_pickle=True。否则会报错 

                ValueError: Object arrays cannot be loaded when allow_pickle=False

  • 创建文件夹时安全的做法是用exist_ok:只有在目录不存在时创建目录,目录已存在时不会抛出异常。如果不加这个,在文件存在的情况下会报错:文件已存在
  • 在load数据时,file_name需要后面是带.npz的,否则就会找不到文件。但是存储的时候的file_name不带.npz会自动补充。不过尽量还是写全吧

详细的关于numpy文件读写的原文说明:https://numpy.org/doc/stable/reference/generated/numpy.savez.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值