我有一个大的字节数组,我将其存储到文件中以进行后处理。对于此示例,我们假设数据是一个从0到3的基数为10的计数器。
我从某种方法中检索数据的格式是字节数组,由于模拟需要大量数据集,因此我需要有效地存储它。因此,我将其存储为
f=open('data_0.txt','w')
f.write(str(b_a))
f.close()
当我阅读它时,会得到一串数据:data_read = b'\x00\x00\x01\x00\x02\x00\x03\x00'
f=open('data_0.txt')
data_read = f.read()
f.close()
我希望一个函数采用字符串:b'\x00\x00\x01\x00\x02\x00\x03\x00'
并将其转换为[0, 1, 2, 3]
的数组。
当我使用struct.unpack("BBBBBBBB" , data_read)
时,我会期望0,0,1,0,2,0,3,0
,相反,它只显示b,',\,x等的ascii,而对于ord(0)
,{ {1}}等。
是否有方便的函数或Python方式从字符串ord(1)
中提取并将其转换为b'\x00\x00\x01\x00\x02\x00\x03\x00'
的数组?
答案 0 :(得分:1)
您需要使用short
或unsigned short
:)
>>> import struct
>>> data_read
b'\x00\x00\x01\x00\x02\x00\x03\x00'
>>> struct.unpack("hhhh" , data_read)
(0, 1, 2, 3)
>>> struct.unpack("HHHH" , data_read)
(0, 1, 2, 3)
答案 1 :(得分:0)
如果获得b,',\,x等的ascii显示,则表示该文件实际包含它。实际上,它是由str(b_a)
调用引起的。
演示:
>>> b_a = b'\x00\x00\x01\x00\x02\x00\x03\x00'
>>> s_a = str(b_a)
>>> print(s_a)
b'\x00\x00\x01\x00\x02\x00\x03\x00'
>>> [hex(ord(x)) for x in s_a]
['0x62', '0x27', '0x5c', '0x78', '0x30', '0x30', '0x5c', '0x78', '0x30', '0x30', '0x5c', '0x78', '0x30', '0x31', '0x5c', '0x78', '0x30', '0x30', '0x5c', '0x78', '0x30', '0x32', '0x5c', '0x78', '0x30', '0x30', '0x5c', '0x78', '0x30', '0x33', '0x5c', '0x78', '0x30', '0x30', '0x27']
这是b,',\,x,0等的显示。
ast.literal_eval
可用于将其转换回字节字符串。演示:
>>> b2 = ast.literal_eval(s_a)
>>> b2 == b_a
True
>>> struct.unpack('HHHH', b2)
(0, 1, 2, 3)
因此,如果要在编写时保留str
调用,则必须以这种方式阅读:
with open('data_0.txt') as f:
data_read = f.read()
data = struct.unpack('HHHH', ast.literal_eval(data_read))