Из этого вопроса , который решил начало моей проблемы, я все еще сталкиваюсь с проблемой невозможности считывания нескольких 32-битных значений с плавающей запятой одновременно с модулем struct
.
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
и связанный вопрос выше для обоснования здесь).Однако этот метод, похоже, считывает одно и то же число с плавающей запятой в каждый индекс массива одинаковое количество раз aas data_sizes[idx]
, а не уникальные значения.Я знаю, что мой файл не должен давать такой результат, так как я перевожу его на Python из рабочего скрипта MATLAB.
Что я делаю не так с моей реализацией?
РЕДАКТИРОВАТЬ:
Отчасти благодаря ответу я заметил некоторые ошибки в моем исходном коде (и ту, на которую указал пользователь, и другие, которые скомпрометировали то, как я пытался прочитать из файла).Я добавляю отредактированный исходный код, чтобы конкретизировать проблему и дать более подробное объяснение за кредит, отданный принятому ответу.
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