我正在编写一个应该在Python 2和3中工作的模块,我需要定义一个二进制字符串。
通常这会像data = b'abc'
,但是这段代码在Python 2.5上失败,语法无效。
如何以适用于所有版本的Python 2.5 +
的方式编写上述代码注意:这必须是binary
(它可以包含任何类型的字符,0xFF),这非常重要。
答案 0 :(得分:5)
我会推荐以下内容:
from six import b
当然,这需要six module。 如果你不想要,那么这是另一个版本:
import sys
if sys.version < '3':
def b(x):
return x
else:
import codecs
def b(x):
return codecs.latin_1_encode(x)[0]
这些解决方案(基本上是相同的)工作,干净,速度快,并且可以支持所有256字节值(这里没有其他解决方案)。
答案 1 :(得分:1)
如果字符串只有ASCII字符,请调用encode
。这将为您提供Python 2中的str
(就像b'abc'
)和Python 3中的bytes
:
'abc'.encode('ascii')
如果没有,不是将二进制数据放入源代码中,而是创建一个数据文件,用'rb'
打开它并从中读取。
答案 2 :(得分:-3)
您可以存储base64编码的数据。
第一步是转换为base64:
>>> import base64
>>> base64.b64encode(b"\x80\xFF")
b'gP8='
这要做一次,使用b
与否取决于您使用的Python版本。
在第二步中,将此字节字符串放入没有b
的程序中。
然后确保它在py2和py3中工作。
import base64
x = 'gP8='
base64.b64decode(x.encode("latin1"))
在2.6中为您提供str
'\x80\xff'
(在2.5中也应该有效),在3.x中为b'\x80\xff'
。
除了上述两个步骤之外,你可以对十六进制数据做同样的事情,你可以这样做
import binascii
x = '80FF'
binascii.unhexlify(x) # `bytes()` in 3.x, `str()` in 2.x