Python float与bytearray互转时struct.unpack报4字节缓冲区错误如何解决
错误原因
- 你用
struct.pack('f', data2)打包得到的是长度为4的bytes对象,将这类对象组成的列表传入np.save存储时,Numpy会自动将其转换为object类型的数组,该类数组的序列化依赖pickle机制。 - Numpy 1.16.3及以上版本中,
np.load默认关闭了allow_pickle参数,导致读取1-100npy.npy时无法正确还原原本的4字节bytes对象,拿到的data4长度不足4字节,触发unpack requires a buffer of 4 bytes报错。 - 额外冗余问题:手动循环用struct打包解包的效率极低,也完全没有必要,Numpy自带原生的浮点类型与字节序列转换能力。
解决方案
快速修复现有代码
仅需修改np.load的参数,开启pickle支持即可:
# 把原来的array2 = np.load('1-100npy.npy')替换为下面这行 array2 = np.load('1-100npy.npy', allow_pickle=True)
同时注意最后保存文本的fmt参数多了多余的单引号,修改为fmt='%f'即可正常输出。
更优实现方案(推荐)
完全抛弃手动struct循环,直接用Numpy原生API实现float与字节的互转,代码量大幅减少,执行效率更高:
import numpy as np # 生成测试数据 array = np.arange(0, 100.1, 0.1, dtype=np.float32) # 保存为文本文件 np.savetxt('1-100.txt', array, fmt='%f') # 读取文本数据 read_array = np.loadtxt('1-100.txt', dtype=np.float32) # 直接转字节序列存二进制文件,无需struct打包 read_array.tofile('1-100.bin') # 直接从二进制文件读回float数组,无需struct解包 float_array = np.fromfile('1-100.bin', dtype=np.float32) # 保存最终文本 np.savetxt('1-100 2.txt', float_array, fmt='%f')
内容的提问来源于stack exchange,提问作者서정원
相关产品推荐
相关产品推荐

