我有一个二进制文件,它只是由有符号32位IEEE754浮点数列表组成。它们没有被任何东西分隔,而是一个接一个地出现,直到EOF。
我该如何从此文件中读取并正确解释它们为浮点数呢?
我尝试使用read(4)
,但它会自动将它们转换为带ASCII编码的字符串。
我还尝试使用bytearray
,但它只按1个字节一次读取,而不是我需要的4个字节。
我有一个二进制文件,它只是由有符号32位IEEE754浮点数列表组成。它们没有被任何东西分隔,而是一个接一个地出现,直到EOF。
我该如何从此文件中读取并正确解释它们为浮点数呢?
我尝试使用read(4)
,但它会自动将它们转换为带ASCII编码的字符串。
我还尝试使用bytearray
,但它只按1个字节一次读取,而不是我需要的4个字节。
struct.unpack('f', file.read(4))
您也可以同时解压缩多个文件,这样速度会更快:
struct.unpack('f'*n, file.read(4*n))
import struct
(num,) = struct.unpack('f', f.read(4))
到目前为止,我发现最快的方法(就性能而言)是 numpy.fromfile
import numpy as np
class FloatReader:
def __init__(self, filename):
self.f = open(filename, "rb")
def read_floats(self, count : int):
return np.fromfile(self.f, dtype=np.float32, count=count, sep='')
这种方法在性能方面比struct.unpack
快得多!
unpack('{0}f'.format(n), ...)
,或者如果您预先知道数量,只需使用unpack('10f', ...)
。 最好使用内置的重复方法,而不是依赖字符串操作。 - Scott Griffiths'10f'
更好,原因完全相同:它比'f'*10
稍微更短且更易于阅读。 - Marcelo Cantos