Если вы получаете отображение ascii для b, ', \, x и т. Д., Это означает, что файл фактически содержит его.Фактически это вызвано вызовом 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))