【发布时间】:2020-10-17 04:04:26
【问题描述】:
假设我正在生成一个需要序列化的随机数组
def generator():
num = 0
while num < random.randint(0, 10):
yield np.array(range(2))
num += 1
with open('out.npy', 'wb') as f:
for item in generator():
np.save(f, item)
现在我怎么知道我需要np.load() 多少次才能取回所有数组? np.load() 最终会抛出异常所以我想出了
with open('out.npy', 'rb') as f:
try:
while 1:
item = np.load(f)
print(item)
except:
print("EoF")
但我想知道是否有一种方法可以检测文件结束,或者只是一种更好的方法来做到这一点。
【问题讨论】:
-
您正在使用 np.save/load 的未记录功能。没有任何东西可以记录您串在一起的阵列数量。阅读直到你得到一个EOF异常是非常好的Python。但是你应该改进你的
except子句,这样它就可以抓住它。并做一些事情来收集所有这些item数组。 -
@hpaulj 是的,这只是说明问题的示例代码。实际上,我按照numpy.save 的最后一个示例进行了保存/加载,但发现自己处于此用例中,我不知道实际保存项目的数量。顺便说一句,在耗尽每个元素后引发的异常是
ValueError: Cannot load file containing pickled data when allow_pickle=False。 -
如果
np.load(f, allow_pickle=True)你得到EOFError。 -
您的通用
except隐藏了此ValueError,这与您的 EOF 无关。您的一个或多个数组被保存为 object dtype,可能是因为它不是一个开始的数组,或者包含不同大小的列表/数组。 -
@hpaulj 没有人,引发 ValueError 的代码是您在问题中看到的代码。可能会引发 ValueError ,因为它已经用尽了它试图读取无法读取的内容的每个项目。您可以自己尝试代码,不会花费那么长时间。
标签: python python-3.x numpy serialization deserialization