python,修复损坏的npy文件。 ValueError:新数组的总大小必须保持不变

时间:2016-05-12 20:26:14

标签: python numpy

我运行一个程序,每20秒在npy文件中保存数据,但会覆盖旧程序,以更新文件。

昨天经过一天的数据收集后,程序崩溃了,因为有人在错误的时刻做了键盘中断的人为错误。

现在加载npy文件后,我收到错误消息 ValueError:新数组的总大小必须保持不变

我已经尝试了

以open(“test.npy”,“rb”)作为npy:     a = np.load(npy)

解决方案,但错误仍然存​​在。

我认为正在发生的是npy文件中缺少行,但我不知道如何修复它。 npy文件的大小仍为MB,因此可以保存一些东西。

有没有人知道如何修复我的文件并获取其中的数据?

否则我会丢失一天的数据。

非常感谢任何帮助!

编辑:在这里可以找到损坏的文件和一个好的例子,除了数字不同之外应该完全相同。 http://perswww.kuleuven.be/~u0077049/

形状是(1024,3649) dtype是dtype('float64')

1 个答案:

答案 0 :(得分:3)

npy format is very simple。它以数据的ascii描述(数据类型,数组大小)开始,然后是平面二进制转储。标头数据总是16个字节的倍数,恰好是float64(8个字节)大小的倍数。

在此示例中,标头为80个字节。在你的情况下,你必须尝试。

import numpy as np

# write npy file
a = 10**np.array(np.linspace(-10, 10, 51), dtype=np.float64)
np.save('foo.npy', a)

# read back
b = np.fromfile('foo.npy', dtype=np.float64)
print(b[10:])

您必须使用reshape以正确的(Fortran)数组顺序进入它。

我简要地看了一下你的文件;问题似乎是该文件应该是29892688字节但是损坏的文件是29892609,即79字节太短。如果使用79个字节的零填充文件(或使用上述过程读取的数组),则可能会再次读取它。