写入文件字节和字符串

时间:2016-09-23 15:00:32

标签: python python-3.x file-io byte

我必须使用little-endian编码创建具有一些字符和十六进制值的文件。要进行编码,我使用:

pack("I", 0x01ddf23a)

这给了我:

b':\xf2\xdd\x01'

第一个问题是,这给了我无法写入文件的字节字符串。第二个是\ x3a转向':#39;。我所期望的是,将文件\ x3a \ xf2 \ xdd \ x01写为字节而不是字符。

我尝试了什么:

>>> a=0x01ddf23a

>>> str(pack("I", a))
"b':\\xf2\\xdd\\x01'" <= wrong

>>> pack("I", a).hex()
'3af2dd01             <= I need '\x' before each byte

>>> pack("I", a).decode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf2 in position 1: invalid continuation byte

从&#34; w&#34;更改open()到&#34; wb&#34;强迫我只写字节,但我想写很多字符串和几个字节,例如:

Hello world
^I^M^T^B
End file

我知道我可以这么做:

fs.open("file" "w")
fs.write("Hello world")
fs.write("\x3a\xf2\xdd\x01")
fs.write("End file")
fs.close()

但是这使得我的字节值0x01ddf23a难以阅读,并且在以该形式更改此值时很容易出错。

1 个答案:

答案 0 :(得分:4)

您正在生成字节,可以写入以二进制模式打开的文件而不会出现问题。打开时将b添加到文件模式,并使用bytes字符串文字或将字符串编码为字节,如果您还需要编写其他数据:

with open("file", "wb") as fs:
    fs.write(b"Hello world")  # note, a byte literal!
    fs.write(pack("I", 0x01ddf23a))
    fs.write("End file".encode('ASCII'))  # encoded string to bytes

替代方案是首先将二进制打包数据解码为文本字符串,但由于打包数据实际上不包含可解码文本,因此该方法需要扭曲强制二进制数据可再次解码和编码,仅当您的文件编码设置为Latin-1并且严格限制您可以添加的实际文本时才有效。

bytes表示将始终尝试在可能的情况下显示可打印字符。字节\x3a也是':'字符的正确ASCII值,因此在bytes表示中,后者优先于使用\x3a转义序列。 正确值出现在bytes值中,并且将完全正确地写入文件:

>>> b'\x3a'
b':'
>>> b'\x3a' == b':'
True
>>> b':'[0]
58
>>> b'\x3a'[0]
58
>>> hex(58)
'0x3a'