我对字符串vs字节数组的区别很好。 Python3区分字符串和字节,而python2不太清晰。精细。 考虑以下两行代码:
a=b'AAA' #a bytes array seen from Python3, a string/bytes for python2
b='BBB' #a string for python3, a string/bytes for python2
我想编写一些代码转换,然后将a
和b
连接起来,并返回一个字节/字符串(在python2中)或字节数组(在python3中)。
(预期结果beeing-视为ASCII字符AAABBB)
换句话说,我想要一条与python版本无关的行:
result = a+b #returns a string/bytes in python2
和
result = a+bytes(b,'utf-8') #returns a bytes array in python3
我希望这行代码可以在python 2和3上运行(无需更改),并避免使用花哨的非标准软件包(结构可以),因为它可以在嵌入式系统上运行。
如果您想知道哪种编码,我最好的选择是去最接近8位扩展ASCII表(256个值:我可能有反斜杠或欧洲字符,但没有中文)
到目前为止,我发现最好的是: 结果= a + b.encode('ASCII')
这是ASCII字符> 127的问题。我尝试使用“ cp437”,但无论如何它似乎默认为ascii ...
@martineau询问的尝试:
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a=b'aaa'
>>> b='bbbä'
>>> a+b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat str to bytes
>>> a+bytes(b,'latin1')
b'aaabbb\xe4'
Python 2.7.15rc1 (default, Nov 12 2018, 14:31:15)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a=b'aaa'
>>> b='bbbä'
>>> a+b
'aaabbb\xc3\xa4'
>>> a+bytes(b,'latin1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: str() takes at most 1 argument (2 given)
答案 0 :(得分:0)
我建议看一下six
,这是一个专门设计用于处理Python 2和Python 3之间的(某些)差异的Python模块。特别是函数ensure_binary
(请参阅https://six.readthedocs.io/#six.ensure_binary )可以解决您的问题。
据我所知,您希望避免依赖“高级第三方库”,但是six
不是“高级”;)但是,我不知道嵌入式系统上的开销可能是多少
答案 1 :(得分:0)
我不知道真正的版本是“不可知论”的方式,但以下内容似乎非常接近该理想,并且可以在Python 2.7.16和3.7.2中使用:
a = b'aaa'
b = 'bbb\xc2\x84'
try:
b = bytes(b, 'latin1')
except TypeError:
b = bytes(b)
c = a + b
print(repr(c)) # -> 'aaabbb\xc2\x84'