我正在使用以下方法读取二进制文件
numpy.fromfile(file, dtype=)
二进制文件有多种类型,我知道组织。因此我按如下方式定义了一个dtype数组:
dtypearr = [('a','i4',1),('b','S1',8),('c','i4',1),
('d','i4',1),('e','S1',8)]
这个dtype数组说二进制文件的第一个值是一个整数后跟8个字符等...
我遇到的问题是二进制文件不是dtypearr的大小。二进制文件具有在dtypearr 重复n次中定义的结构。
到目前为止,我所做的是用新字段名称重复dtypearr,直到它与二进制文件的大小相同。
然而,我希望不知怎的,我可以在不重复dtypearr的情况下实现这一目标。相反,我希望在每个字段中存储一个数组。例如,我想要structuredarray [' a']或structuredarray [' b']给我一个数组而不是单个值。
修改
请注意:
numpy.fromfile(file, dtype=dtypearr)
当模式完全相同时,实现我想要的。以下解决方案也有效。
但是,我提到的二进制文件中的模式并不完全重复。例如,有一个标题部分和多个子部分。每个小节都有自己的重复模式。 f.seek()将适用于最后一小节,但不适用于之前的小节。
答案 0 :(得分:3)
尝试:
import numpy as np
import string
# Create some fake data
N = 10
dtype = np.dtype([('a', 'i4'), ('b', 'S8'), ('c', 'f8')])
a = np.zeros(N, dtype)
a['a'] = np.random.random_integers(0,3, N)
a['b'] = np.array([x for x in string.ascii_lowercase[:N]])
a['c'] = np.random.normal(size=(N,))
# Write to a binary file
a.tofile('test.dat')
# Read data into new array
b = np.fromfile('test.dat', dtype=dtype)
数组a
和b
相同(即np.all(a['a'] == b['a']) is True
):
for col in a.dtype.names:
print col, np.all(a[col] == b[col])
# Prints:
# a True
# b True
# c True
<强>更新强>
如果您有标题信息,可以先打开文件,找到数据的起点然后阅读。例如:
f = open("test.dat", "rb")
f.seek(header_size)
b = np.fromfile(f, dtype=dtype)
f.close()
你必须知道大小(header_size
),但那时你应该是好的。如果有子部分,您可以提供要抓取的项目数。我没有测试计数是否有效。如果您不受这种二进制格式的约束,我建议使用像hdf5这样的东西将多个数组存储在一个文件中。