То, что вы видите, является артефактом отображения данных вашим редактором. Если вы читаете файл в двоичном виде, вы получите те же байты, которые вы написали. Они просто байты, не закодированные как что-либо. Ваш редактор выглядит так, как будто он декодирует строку для отображения ... неправильно.
Ниже я пишу двоичный файл с Python 3.6 и читаю его обратно с 2.7 и 3.6:
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> open('test.txt','wb').write(b'\x8c\x8d\x91\x8c')
4
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> open('test.txt','rb').read()
'\x8c\x8d\x91\x8c'
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> open('test.txt','rb').read()
b'\x8c\x8d\x91\x8c'
В обоих случаях записываются одни и те же четыре байта.
Попробуйте отобразить значение байтов вместо строк:
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> b = open('test.txt','rb').read()
>>> for c in b:
... print(hex(c))
...
0x8c
0x8d
0x91
0x8c
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> b = open('test.txt','rb').read()
>>> for c in b:
... print hex(ord(c))
...
0x8c
0x8d
0x91
0x8c