用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浮点?的主要内容,如果未能解决你的问题,请参考以下文章