Python 写入文件字节和字符串

Python 写入文件字节和字符串,python,python-3.x,file-io,byte,Python,Python 3.x,File Io,Byte,我必须创建一些文件,其中有一些字符和十六进制值在小端编码。要进行编码,我使用: pack("I", 0x01ddf23a) 这给了我: b':\xf2\xdd\x01' 第一个问题是,这给了我无法写入文件的字节字符串。第二个是\x3a转向“:”。我所期望的是以字节而不是字符的形式写入文件\x3a\xf2\xdd\x01 我尝试的是: >>> a=0x01ddf23a >>> str(pack("I", a)) "b':\\xf2\\xdd\\x01'"

我必须创建一些文件,其中有一些字符和十六进制值在小端编码。要进行编码,我使用:

pack("I", 0x01ddf23a)
这给了我:

b':\xf2\xdd\x01'
第一个问题是,这给了我无法写入文件的字节字符串。第二个是\x3a转向“:”。我所期望的是以字节而不是字符的形式写入文件\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
我知道我可以做到这一点:

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

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

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

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并且严重限制了您可以添加的实际文本时,它才起作用

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

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

完美的正是我所需要的:)首先,易于在二进制模式下对文件使用字节字符串文字,第二个很好的解释是,如果python在字节字符串文字中向我显示一些ascii,这并不意味着它将打印ascii字符。
>>> b'\x3a'
b':'
>>> b'\x3a' == b':'
True
>>> b':'[0]
58
>>> b'\x3a'[0]
58
>>> hex(58)
'0x3a'