python - 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
看起来像64f
或data_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
解决方案
做的时候:
buffer = input_DATA.read(Float32.size) * data_sizes[idx]
您只是在读取一个浮点数并将其复制 data_sizes[idx] 次。
您只需要执行以下操作:
buffer = input_DATA.read(Float32.size * data_sizes[idx])
推荐阅读
- c# - 合并列表的最小和
- qt - 是否可以在 Qml 中强制更新事件?如果是这样怎么办?
- python - 使用字典更改变量的参数
- r - 在 R (Zendesk API) 中使用来自 API 的 JSON 数据
- reactjs - 如何使用 AntD 管理表中的行数?
- c++ - 如何从 WM_INPUT 原始数据中获取触摸屏协调
- python - 声明在 llvmlite 中返回 void 的函数时出现 AssertionError
- c# - 使用 lambda 中的单个 orderId 按最新日期时间过滤对象列表
- php - 这在 PHP 中有效吗?
- wordpress - wp-admin 页面的“此页面不起作用”