首页 > 解决方案 > Python struct模块从文件中读取多个浮点数

问题描述

这个问题开始,解决了我的问题,我仍然面临无法使用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看起来像64fdata_sizes[idx]与每个循环迭代中连接的任何数字f(请参阅struct模块文档和上面的链接问题以了解此处的基本原理)。但是,这种方法似乎只是将相同的浮点数读取到每个数组索引中相同的次数 aas 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

标签: pythonpython-3.xfile-io

解决方案


做的时候:

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

您只是在读取一个浮点数并将其复制 data_sizes[idx] 次

您只需要执行以下操作:

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

推荐阅读