Python结构模块从文件中读取多个浮点



从这个解决了我问题的开始的问题来看,我仍然面临着无法使用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模块文档和上面的链接问题,了解此处的基本原理(。然而,这种方法似乎只将相同的浮点数读取到每个数组索引中相同次数的aasdata_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

执行时:

buffer = input_DATA.read(Float32.size) * data_sizes[idx]

您只是读取ONEfloat并将其复制data_sizes[idx]次。

你只想做以下事情:

buffer = input_DATA.read(Float32.size * data_sizes[idx])

最新更新