簡體   English   中英

寫入文件字節和字符串

[英]Write to file bytes and strings

我必須創建在Little-endian編碼中具有一些char和hex值的文件。 要進行編碼,我使用:

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難以閱讀,以這種形式更改此值時容易犯一些錯誤。

您正在生成字節,可以將其寫入以二進制模式打開的文件而不會出現問題。 打開時將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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM