Python如何写入二进制文件?
我有一个字节列表整数,这是类似的
[120, 3, 255, 0, 100]
我怎样才能把这个列表写成一个二进制文件?
这会工作吗?
newFileBytes = [123, 3, 255, 0, 100] # make file newFile = open("filename.txt", "wb") # write to file newFile.write(newFileBytes)
这正是bytearray
的用途:
newFileByteArray = bytearray(newFileBytes) newFile.write(newFileByteArray)
如果您使用的是Python 3.x,则可以使用bytes
(可能应该更好,因为它表示您的意图更好)。 但在Python 2.x中,这是行不通的,因为bytes
只是str
的别名。 像往常一样,用交互式解释器来显示比用文本解释更容易,所以让我来做。
Python 3.x:
>>> bytearray(newFileBytes) bytearray(b'{\x03\xff\x00d') >>> bytes(newFileBytes) b'{\x03\xff\x00d'
Python 2.x:
>>> bytearray(newFileBytes) bytearray(b'{\x03\xff\x00d') >>> bytes(newFileBytes) '[123, 3, 255, 0, 100]'
使用struct.pack
将整数值转换为二进制字节,然后写入字节。 例如
newFile.write(struct.pack('5B', *newFileBytes))
但是,我永远不会给二进制文件一个.txt
扩展名。
这种方法的好处是,它也适用于其他types,例如,如果任何值大于255,则可以使用'5i'
作为格式,而不是获得完整的32位整数。
要将整数<256转换为二进制,请使用chr
函数。 所以你正在看下面的事情。
newFileBytes=[123,3,255,0,100] newfile=open(path,'wb') newfile.write((''.join(chr(i) for i in newFileBytes)).encode('ascii'))
您可以使用下面的代码示例使用Python 3语法:
from struct import pack with open("foo.bin", "wb") as file: file.write(pack("<IIIII", *bytearray([120, 3, 255, 0, 100])))
这里是shell单行程:
python -c $'from struct import pack\nwith open("foo.bin", "wb") as file: file.write(pack("<IIIII", *bytearray([120, 3, 255, 0, 100])))'
从Python 3.2+开始,你也可以使用to_bytes
native int方法完成这个工作:
newFileBytes = [123, 3, 255, 0, 100] # make file newFile = open("filename.txt", "wb") # write to file for byte in newFileBytes: newFile.write(byte.to_bytes(1, byteorder='big'))
也就是说,在这种情况下,对to_bytes
每个单独调用to_bytes
创build一个长度为1的string,其字符以big-endian顺序排列(对于长度为1的string而言是微不足道的),它表示整数值byte
。 您也可以将最后两行缩短为一行:
newFile.write(''.join([byte.to_bytes(1, byteorder='big') for byte in newFileBytes]))
使用泡菜,像这样:import泡菜
你的代码看起来像这样:
import pickle mybytes = [120, 3, 255, 0, 100] with open("bytesfile", "wb") as mypicklefile: pickle.dump(mybytes, mypicklefile)
要读取数据,请使用pickle.load方法