Модуль структуры Python, считывающий несколько плавающих точек из файла - PullRequest
0 голосов
/ 25 ноября 2018

Из этого вопроса , который решил начало моей проблемы, я все еще сталкиваюсь с проблемой невозможности считывания нескольких 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

1 Ответ

0 голосов
/ 25 ноября 2018

При выполнении:

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

вы просто читаете ONE float и копируете его data_sizes [idx] раза.

То, что вы просто хотите сделать, этоследующее:

buffer = input_DATA.read(Float32.size * data_sizes[idx])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...