python3将字符串写入整个文件的方式
我是Python3中的新手。 我有一个写入文件的字符串的问题。python3将字符串写入整个文件的方式
下面的字符串是我试图写入文件。
ÀH \x10\x08\x81\x00
(十六进制,c04820108810)
当我使用xxd
命令,我可以检查有字符串和文件之间的差异检查的文件。
00000000: c380 4820 1008 c281 00 ..H .....
这是我写的代码。
s = 'ÀH \x10\x08\x81\x00'
with open('test', 'w') as f:
f.write(s)
问题是如何将这个字符串写入文件的整体。
看来你想编写二进制数据。在这种情况下,您应该使用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中对其进行编码时的值。
字符串不是静态的。在这种情况下,字符串被偶然显示为Latin-1表示。如果它是动态的,我怎样才能将字符串转换为像b'\ xc0 \ x48 \ x20 \ x10 \ x88 \ x10'这样的字节? – junsang
我在答案中给出了你,你可以在字符串上调用'.encode()'将其转换为字节字符串。如果你不想使用UTF-8,你也可以指定一个不同的编码,例如('latin-1')'。' - 'x'x'x8'x81'x00'。但这一切都取决于你的输入来自哪里。如果你真的在这里处理二进制文件,它不应该在解码字符串中。 – poke
我明白了。非常感谢。你的回答和评论对我很有帮助。 – junsang
你想把它写成二进制吗?然后使用'bytes',而不是'str':'s =b'ÀH\ x10 \ x08 \ x81 \ x00''。 – poke