【问题标题】:Write to file bytes and strings写入文件字节和字符串
【发布时间】:2016-09-23 15:00:31
【问题描述】:

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

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

将 open() 从 "w" 更改为 "wb" 迫使我只写字节,但我想写很多字符串和几个字节,例如:

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 难以阅读,并且在以这种形式更改此值时很容易出错。

【问题讨论】:

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


    【解决方案1】:

    您正在生成字节,这些字节可以毫无问题地写入以二进制模式打开的文件。打开时将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'
    

    【讨论】:

    • 完美!正是我需要的 :) 首先,易于使用字节字符串文字和二进制模式的文件,第二个很好的解释是,如果 python 在字节字符串文字中显示一些 ascii,这并不意味着它会打印我 ascii 字符。
    猜你喜欢
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 2011-10-24
    相关资源
    最近更新 更多