用python从二进制文件中读取32位带符号的ieee 754浮点?

Posted

技术标签:

【中文标题】用python从二进制文件中读取32位带符号的ieee 754浮点?【英文标题】:Reading 32 bit signed ieee 754 floating points from a binary file with python? 【发布时间】:2011-09-11 06:39:36 【问题描述】:

我有一个二进制文件,它是一个简单的有符号 32 位 ieee754 浮点数列表。它们没有被任何东西隔开,只是一个接一个地出现,直到EOF。

我如何从这个文件中读取并将它们正确解释为浮点数?

我尝试使用read(4),但它会自动将它们转换为带有 ascii 编码的字符串。

我也尝试过使用bytearray,但这一次只需要 1 个字节,而不是我需要的 4 个字节。

【问题讨论】:

【参考方案1】:

看看struct.unpack。像下面这样的东西可能会起作用......

f = struct.unpack('f', data_read)

【讨论】:

【参考方案2】:
struct.unpack('f', file.read(4))

你也可以一次解压多个,这样会更快:

struct.unpack('f'*n, file.read(4*n))

【讨论】:

+1 表示 'f'*n;该语法记录在哪里?我一定在我的 Python 入门中错过了这一点。 字符串乘法记录在教程和序列对象的库参考部分中。 解压几个的更一般的方法是unpack('0f'.format(n), ...),或者如果你提前知道有多少,那么例如unpack('10f', ...)。使用内置的重复方法比依赖字符串操作更好。 @cdiggins:我倾向于支持需要最少打字且最容易阅读的内容。这两个因素偶尔会发生冲突,因此您可能需要权衡其中一个,但在这种情况下,我的版本更短 并且 更清晰。在性能方面,我希望这两种形式几乎相同,因为大部分时间都花在了 I/O 子系统上。如果在编码时知道长度,那么我同意'10f' 更好,原因完全相同:它比'f'*10 略短且更易于阅读。 @Marcelo,我同意这个原则,但考虑拆包 100,000 个整数。创建一个 100k 长的格式字符串对我来说没有意义。相反,'0f'.format(1000000) 更有意义。【参考方案3】:
import struct
(num,) = struct.unpack('f', f.read(4))

【讨论】:

以上是关于用python从二进制文件中读取32位带符号的ieee 754浮点?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中从二进制文件中读取整数

在python中如何从二进制文件中读取信息

从二进制文件中读取矩阵

如何从二进制文件中读取int型序列

如何从二进制文件中读取块并使用 Python 或 Perl 解包提取结构?

用 C 语言从二进制文件中读取位