我有一个整数字节列表,类似于
[120, 3, 255, 0, 100]
如何将此列表作为二进制文件写入文件?
这会有用吗?
newFileBytes = [123, 3, 255, 0, 100]
# make file
newFile = open("filename.txt", "wb")
# write to file
newFile.write(newFileBytes)
答案 0 :(得分:97)
这正是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]'
答案 1 :(得分:23)
使用struct.pack
将整数值转换为二进制字节,然后写入字节。 E.g。
newFile.write(struct.pack('5B', *newFileBytes))
但是我永远不会给二进制文件.txt
扩展名。
此方法的好处是它也适用于其他类型,例如,如果任何值大于255,您可以使用'5i'
格式来获得完整的32位整数。< / p>
答案 2 :(得分:8)
要转换整数&lt; 256到二进制,使用chr
函数。所以你正在考虑做以下事情。
newFileBytes=[123,3,255,0,100]
newfile=open(path,'wb')
newfile.write((''.join(chr(i) for i in newFileBytes)).encode('charmap'))
答案 3 :(得分:5)
从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
都会创建一个长度为1的字符串,其字符以big-endian顺序排列(对于长度为1的字符串,这是微不足道的),它表示整数值{ {1}}。您还可以将最后两行缩短为一行:
byte
答案 4 :(得分:4)
您可以使用Python 3语法使用以下代码示例:
from struct import pack
with open("foo.bin", "wb") as file:
file.write(pack("<IIIII", *bytearray([120, 3, 255, 0, 100])))
这是shell one-liner:
python -c $'from struct import pack\nwith open("foo.bin", "wb") as file: file.write(pack("<IIIII", *bytearray([120, 3, 255, 0, 100])))'
答案 5 :(得分:1)
使用pickle,如下所示:import pickle
您的代码如下所示:
import pickle
mybytes = [120, 3, 255, 0, 100]
with open("bytesfile", "wb") as mypicklefile:
pickle.dump(mybytes, mypicklefile)
要读取数据,请使用pickle.load方法
答案 6 :(得分:0)
将int数组写入文件的便捷函数,
def write_array(fname,ray):
'''
fname is a file pathname
ray is an array of int
'''
print("write:",fname)
EncodeInit()
buffer = [ encode(z) for z in ray ]
some = bytearray(buffer)
immutable = bytes(some)
with open(fname,"wb") as bfh:
wc = bfh.write(immutable)
print("wrote:",wrote)
return wc
如何调用函数,
write_array("data/filename",[1,2,3,4,5,6,7,8])
并将以下内容包装在一个类中以进行可读的编码/解码:
Encode = {}
Decode = {}
def EncodeInit():
'''
Encode[] 0:62 as 0-9A-Za-z
Decode[] 0-9A-Za-z as 0:62
'''
for ix in range( 0,10): Encode[ix] = ix+ord('0')
for ix in range(10,36): Encode[ix] = (ix-10)+ord('A')
for ix in range(36,62): Encode[ix] = (ix-36)+ord('a')
for ix in range( 0,10): Decode[ix+ord('0')] = ix
for ix in range(10,36): Decode[(ix-10)+ord('A')] = ix
for ix in range(36,62): Decode[(ix-36)+ord('a')] = ix
def encode(x):
'''
Encode[] 0:62 as 0-9A-Za-z
Otherwise '.'
'''
if x in Encode: return Encode[x]
# else: error
return ord('.')
def decode(x):
'''
Decode[] 0-9A-Za-z as 0:62
Otherwise -1
'''
if x in Decode: return Decode[x]
# else: error
return -1