将python float转换为字节

2024-04-26 14:42:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把一个Python浮点转换成一个字节数组,把它编码成32位的小端IEEE浮点数,以便将它写入一个二进制文件。你知道吗

在python3中,现代的Python方法是什么?对于int,我可以执行my_int.to_bytes(4,'little'),但是对于float没有to_bytes方法。你知道吗

如果我能对numpy数组中的每个float(使用dtype)进行一次拍摄,那就更好了数字浮点数32). 但请注意,我需要将其作为字节数组来获取,而不仅仅是立即将数组写入文件。你知道吗

有一些听起来类似的问题,但它们似乎主要是关于获取十六进制数字,而不是写入二进制文件。你知道吗


Tags: 文件to方法编码字节bytes二进制数字
3条回答

你可以用structpack像这样的bytes

>>> import struct
>>> struct.pack('<f', 3.14) # little-endian
b'\xc3\xf5H@'
>>> struct.pack('>f', 3.14) # big-endian
b'@H\xf5\xc3'

使用右边的dtype可以将数组的数据缓冲区写入bytestring或二进制文件:

In [449]: x = np.arange(4., dtype='<f4')                                        
In [450]: x                                                                     
Out[450]: array([0., 1., 2., 3.], dtype=float32)
In [451]: txt = x.tostring()                                                    
In [452]: txt                                                                   
Out[452]: b'\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00@\x00\x00@@'
In [453]: x.tofile('test')                                                                                                                           
In [455]: np.fromfile('test','<f4')                                             
Out[455]: array([0., 1., 2., 3.], dtype=float32)
In [459]: with open('test','br') as f: print(f.read())                          
b'\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00@\x00\x00@@'

改变偏好:

In [460]: x.astype('>f4').tostring()                                            
Out[460]: b'\x00\x00\x00\x00?\x80\x00\x00@\x00\x00\x00@@\x00\x00'

NumPy数组附带了一个^{}方法,该方法提供了它们的原始数据字节的转储:

arr.tobytes()

您可以指定一个order参数来为多维数组使用C顺序(行主键)或F顺序(列主键)。你知道吗

由于要将字节转储到文件中,您可能还对^{}方法感兴趣,该方法直接将字节转储到文件中:

arr.tofile(your_file)

tofile总是使用C顺序。你知道吗

如果需要更改endianness,可以使用^{}方法。(newbyteorder有一个更方便的签名,但不会更改底层字节,因此不会影响tobytes

import sys
if sys.byteorder=='big':
    arr = arr.byteswap()
data_bytes = arr.tobytes()

相关问题 更多 >