2016-01-27 50 views
4

在以前的Python 2程序,我用下面這行寫一個字節的二進制文件:寫入一個字節在Python 3.x的文件

self.output.write(chr(self.StartElementNew)) 

但因爲Python 3,你不能將字符串和字符串寫入流,而不先將它們編碼爲字節(這對於適當的多字節字符支持有意義)

現在是否存在諸如byte(self.StartElementNew)之類的內容?如果可能的話,與Python 2的兼容性?

回答

3

對於範圍內0-127的值,下面的行總是會產生在Python 2的權利類型(str)和3(bytes):

chr(self.StartElementNew).encode('ascii') 

這並不適用於在工作值範圍128-255,因爲在Python 2中,str.encode()調用包含使用ASCII作爲編解碼器的隱式str.decode(),這將失敗。

對於在0-255範圍內的字節,我會定義一個單獨的功能:

if sys.version_info.major >= 3: 
    as_byte = lambda value: bytes([value]) 
else: 
    as_byte = chr 

然後使用該寫入單字節時:

self.output.write(as_byte(self.StartElementNew)) 

或者,使用six library,它有six.int2byte() function;該庫的Python版本測試爲你提供你用合適的版本的功能:

self.output.write(six.int2byte(self.StartElementNew)) 
+0

由於。沒有測試版本沒有這樣一個簡單的事情的解決方案? – galinette

+0

@galinette:是的,當編寫polyglot代碼時,並非所有事情都可以通過捕獲'ImportError'或'NameError'來完成,恐怕。 –

0

另一種選擇,其與Python 2和3的工作原理,是使用struct

import struct 
self.output.write(struct.pack('B', self.StartElementNew)) 
相關問題