对于运行时间比较长的代码,每隔一定步长进行存储。
本来是想用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