我有上面列出的错误,但一直无法找到它的含义。我是numpy及其{.frombuffer()}命令的新手。触发此错误的代码是:
ARRAY_1=400000004
fid=open(fn,'rb')
fid.seek(w+x+y+z) #w+x+y+z=
if(condition==0):
b=fid.read(struct.calcsize(fmt+str(ARRAY_1)+'b'))
myClass.y = numpy.frombuffer(b,'b',struct.calcsize(fmt+str(ARRAY_1)+'b'))
else:
b=fid.read(struct.calcsize(fmt+str(ARRAY_1)+'h'))
myClass.y = numpy.frombuffer(b,'h',struct.calcsize(fmt+str(ARRAY_1)+'h')) #error this line
其中fmt是'>'其中condition == 0和'<'条件!= 0。这改变了二进制文件的读取方式,大端或小端。 fid是一个已经打开的二进制文件。
到目前为止调试,condition = 1,所以我觉得if条件的最后一个语句也有错误,我现在看不到它。
正如我之前所说,我试图找出错误的含义,但没有运气。如果有人知道为什么它对我有误,我真的很喜欢这个帮助。
答案 0 :(得分:0)
calcsize
给出缓冲区给出格式的字节数。
In [421]: struct.calcsize('>100h')
Out[421]: 200
In [422]: struct.calcsize('>100b')
Out[422]: 100
h
每个项目占用2个字节,因此对于100个项目,它会产生200个字节。
对于frombuffer
,第三个参数是
count : int, optional
Number of items to read. ``-1`` means all data in the buffer.
所以我应该给它100
,而不是200
。
读取一个简单的字节串(在Py3中):
In [429]: np.frombuffer(b'one two three ','b',14)
Out[429]: array([111, 110, 101, 32, 116, 119, 111, 32, 116, 104, 114, 101, 101, 32], dtype=int8)
In [430]: np.frombuffer(b'one two three ','h',14)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-430-30077e924a4c> in <module>()
----> 1 np.frombuffer(b'one two three ','h',14)
ValueError: buffer is smaller than requested size
In [431]: np.frombuffer(b'one two three ','h',7)
Out[431]: array([28271, 8293, 30580, 8303, 26740, 25970, 8293], dtype=int16)
要使用h
阅读,我需要将b
读数的一半计算在内。