如何在Python中定义一个二进制字符串,使其在py2和py3中都能正常工作?
我正在写一个模块,希望它能在Python 2和3中都能运行,我需要定义一个二进制字符串。
通常情况下,这个字符串会像这样写:data = b'abc'
,但在Python 2.5中,这段代码会因为语法错误而无法运行。
我该如何写这段代码,才能在所有Python 2.5及以上的版本中都能正常工作呢?
注意:这个字符串必须是binary
(它可以包含任何类型的字符,比如0xFF),这一点非常重要。
3 个回答
-3
你可以把数据存储为base64编码。
第一步是把数据转换成base64格式:
>>> import base64
>>> base64.b64encode(b"\x80\xFF")
b'gP8='
这个转换只需要做一次,使用b前缀与否取决于你用的Python版本。
第二步是把这个字节字符串放到程序里,不加b前缀。这样可以确保在Python 2和Python 3中都能正常工作。
import base64
x = 'gP8='
base64.b64decode(x.encode("latin1"))
在Python 2.6中,这样做会得到一个字符串 '\x80\xff'
(在2.5版本也应该可以),而在3.x版本中会得到 b'\x80\xff'
。
另外,你也可以用十六进制数据来做同样的事情,方法是:
import binascii
x = '80FF'
binascii.unhexlify(x) # `bytes()` in 3.x, `str()` in 2.x
2
如果字符串里只有ASCII字符,可以使用encode
这个方法。这会在Python 2中给你一个str
类型的结果(就像b'abc'
),而在Python 3中则会得到一个bytes
类型的结果:
'abc'.encode('ascii')
如果字符串里有其他字符,不要直接把二进制数据放在代码里,应该创建一个数据文件,用'rb'
的方式打开它,然后从文件中读取数据。