2016-09-23 47 views
0

我要创造出有小尾数编码字符一些和十六进制值的文件。要做到编码,我使用:写入文件的字节和字符串

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难以阅读和有以这种形式更改此值时很容易犯一些错误。

回答

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' 
+0

完美!正是我需要的:)首先,易于使用字节串文字与二进制模式的文件,第二个很好的解释,如果python显示我一些ascii字节字符串,这并不意味着它会打印我ascii字符。 – Borgo