2017-08-07 40 views
1

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

问题是如何将这个字符串写入文件的整体。

+1

你想把它写成二进制吗?然后使用'bytes',而不是'str':'s =b'ÀH\ x10 \ x08 \ x81 \ x00''。 – poke

回答

1

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

+0

字符串不是静态的。在这种情况下,字符串被偶然显示为Latin-1表示。如果它是动态的,我怎样才能将字符串转换为像b'\ xc0 \ x48 \ x20 \ x10 \ x88 \ x10'这样的字节? – junsang

+0

我在答案中给出了你,你可以在字符串上调用'.encode()'将其转换为字节字符串。如果你不想使用UTF-8,你也可以指定一个不同的编码,例如('latin-1')'。' - 'x'x'x8'x81'x00'。但这一切都取决于你的输入来自哪里。如果你真的在这里处理二进制文件,它不应该在解码字符串中。 – poke

+0

我明白了。非常感谢。你的回答和评论对我很有帮助。 – junsang

-1

您必须将编码样式设置为utf-8,并使用原始字符串,因为您有\转义字符。因此,添加编码风格并在你的字符串之前放入r以使其变为原始。

# -*- coding: utf-8 -*- 
s = r'ÀH \x10\x08\x81\x00' 
with open('test.txt', 'w') as f: 
    f.write(s) 
+0

尽管如此,我得到了相同的结果... – junsang

+1

默认情况下,Python 3已经是UTF-8,不需要指定文件编码。 – poke

+0

@poke谢谢了 –