python3将字符串写入文件的完整方式

时间:2017-08-07 12:33:19

标签: python-3.x file writing

我是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)

问题是如何将此字符串完整地写入文件。

2 个答案:

答案 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)