从this question(解决了我的问题的开始)开始,我仍然面临着无法使用struct
模块一次读取多个32位浮点值的问题。
import struct
class Float32(object):
"""32-bit floating point object."""
# 4 bytes in each 32-bit floating point (8 bits in a byte)
size = 4
class DATA(object):
"""Object representation of information from a DATA file."""
def __init__(self, DATA_filepath, offset_values, data_sizes):
self.DATA_filepath = DATA_filepath
self.raw_data = self.read_DATA(DATA_filepath, offset_values, data_sizes)
def read_DATA(self, DATA_filepath, offset_values, data_sizes):
"""Open DATA (*.data) file and read its contents."""
# initialize an empty list for the raw data
raw_data = []
# read binary data into the list
with open(DATA_filepath, 'rb') as input_DATA:
for idx, offset in enumerate(offset_values):
input_DATA.seek(offset)
buffer = input_DATA.read(Float32.size) * data_sizes[idx]
format_string = str(data_sizes[idx]) + 'f'
value = struct.unpack(format_string, buffer)
raw_data.append(value)
return raw_data
变量format_string
看起来像64f
或data_sizes[idx]
在每个循环迭代中与f
串联的任何数字(请参阅struct
module documentation和链接的问题以上是这里的基本原理)。但是,此方法似乎只将相同的浮点数读入每个数组索引的次数为data_sizes[idx]
,而不是唯一的值。我知道我的文件不应该产生此结果,因为我正在将其从有效的MATLAB脚本转换为Python。
我的实现方式有什么问题?
编辑:
部分感谢答案,我注意到源代码中存在一些错误(用户指出的一个错误和其他损害我尝试从文件读取方式的错误)。我将添加经过编辑的源代码以充实问题,并为获得认可的答案提供更多的解释。
class DATA(object):
"""Object representation of information from a DATA file."""
def __init__(self, DATA_filepath, offset_values, data_sizes):
self.DATA_filepath = DATA_filepath
self.raw_data = self.read_DATA(DATA_filepath, offset_values, data_sizes)
def read_DATA(self, DATA_filepath, offset_values, data_sizes):
"""Open DATA (*.data) file and read its contents."""
# initialize an empty list for the raw data
raw_data = []
# read binary data into the list
with open(DATA_filepath, 'rb') as input_DATA:
for idx, offset in enumerate(offset_values):
input_DATA.seek(offset)
buffer = input_DATA.read(data_sizes[idx])
format_string = str(int(data_sizes[idx] / Float32.size)) + 'f'
value = struct.unpack(format_string, buffer)
raw_data.append(value)
return raw_data
答案 0 :(得分:1)
这样做时:
buffer = input_DATA.read(Float32.size) * data_sizes[idx]
您仅读取一个浮动并将其复制data_sizes [idx]次。
您只是想做的是以下事情:
buffer = input_DATA.read(Float32.size * data_sizes[idx])