Тип bytes
может содержать произвольные данные. Например, (начало) изображения JPEG:
>>> with open('Bilder/19/01/IMG_3388.JPG', 'rb') as f:
... head = f.read(10)
Вы должны думать об этом как о последовательности целых чисел. Это также то, как тип ведет себя во многих аспектах:
>>> list(head)
[255, 216, 255, 225, 111, 254, 69, 120, 105, 102]
>>> head[0]
255
>>> sum(head)
1712
Из соображений удобства (и, я полагаю, по историческим причинам) стандартное repr
представление байтов и их литералов аналогично строки:
>>> head
b'\xff\xd8\xff\xe1o\xfeExif'
Там, где это возможно, используются печатаемые символы ASCII, иначе \xNN
экранирует. Это удобно, если объект bytes
представляет текст:
>>> 'Zoë'.encode('utf8')
b'Zo\xc3\xab'
>>> 'Zoë'.encode('utf16')
b'\xff\xfeZ\x00o\x00\xeb\x00'
>>> 'Zoë'.encode('latin1')
b'Zo\xeb'
Когда вы вводите bytes
литералы, Python использует ASCII для их декодирования. Символы в диапазоне ASCII кодируются таким же образом в UTF-8, поэтому вы наблюдали эквивалентность b'a' == bytes('a', 'utf8')
. Немного менее вводящим в заблуждение могло бы быть выражение b'a' == bytes('a', 'ascii')
.