看來你想編寫二進制數據。在這種情況下,您應該使用bytes
類型而不是str
,因爲這樣可以完全控制序列的二進制內容。
在處理字符串時,您必須考慮到Python將內部處理爲UTF-8的所有內容,因此在輸入類似À
之類的內容時,文件編碼將決定實際輸入的內容。您可以隨時encode()
字符串來看看它的字節:
>>> 'ÀH \x10\x08\x81\x00'.encode()
b'\xc3\x80H \x10\x08\xc2\x81\x00'
您可以將這種使用binascii
模塊對於那些字節更可讀的十六進制字符串爲十六進制:
>>> binascii.hexlify('ÀH \x10\x08\x81\x00'.encode())
b'c38048201008c28100'
正如你所看到的,這與寫入文件的內容相同。所以Python已經做了正確的事情。這只是輸入不是你想要的。
所以取而代之,用一個字節字符串寫入到二進制模式的文件:
# use a bytes string
s = b'\xc0\x48\x20\x10\x88\x10'
# open the file in binary mode
with open('test', 'bw') as f:
f.write(s)
順便說一句。如果您從頭開始查看編碼的字符串,那麼在輸入該字符串時,您已經可以看到您在編碼方面比使用Python不同。你期望À
是二進制的0xc0
,這是因爲它的Latin-1表示有點正確。但是,如果您使用lookup its other representations,則可以看到在默認情況下Python使用的UTF-8中,它是0xc380
,而這又是我們在Python中對其進行編碼時的值。
你想把它寫成二進制嗎?然後使用'bytes',而不是'str':'s =b'ÀH\ x10 \ x08 \ x81 \ x00''。 – poke