看来你想编写二进制数据。在这种情况下,您应该使用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