如何在Python中定义一个二进制字符串,使其在py2和py3中都能正常工作?

7 投票
3 回答
9179 浏览
提问于 2025-04-17 04:14

我正在写一个模块,希望它能在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'的方式打开它,然后从文件中读取数据。

6

我建议你使用以下内容:

from six import b

当然,这需要用到six模块。如果你不想使用这个模块,这里还有另一个版本:

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个字节的值(而这里其他的解决方案都做不到这一点)。

撰写回答