我是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)
问题是如何将此字符串完整地写入文件。
答案 0 :(得分:2)
您似乎想要编写二进制数据。在这种情况下,您应该使用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时,你可以看到在UTF-8中,这是Python默认使用的,它是0xc380
而不是 - 这也是我们在Python中编码它时得到的值。 p>
答案 1 :(得分:-1)
您必须将编码样式设置为utf-8并使用原始字符串,因为您有\ escape字符。因此,添加编码样式并将r放在字符串之前以使其生成。
# -*- coding: utf-8 -*-
s = r'ÀH \x10\x08\x81\x00'
with open('test.txt', 'w') as f:
f.write(s)