我可以接受字符串和字节数组的区别。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中)。(预期结果是将-seen作为ASCII AAABBB)
换句话说,我想要一个python版本不可知的代码行,等同于:
result = a+b #returns a string/bytes in python2
和
result = a+bytes(b,'utf-8') #returns a bytes array in python3
我希望这行代码可以在python2和python3上运行(无需更改),并避免花哨的非标准包(struct也可以),因为这可以在嵌入式系统上运行。
如果你想知道是哪种编码,我的最佳选择是使用最接近8位扩展ASCII表的编码(256个值:我可能有反斜杠或欧洲字符,但没有中文字符)
到目前为止,我找到的最好的结果是: result =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)
发布于 2019-03-21 23:27:58
我建议看看six
,这是一个专门设计用来处理Python2和Python3之间(一些)差异的Python模块。特别是,ensure_binary
函数(请参阅https://six.readthedocs.io/#six.ensure_binary)可以解决您的问题。
请注意,我知道您希望避免依赖“花哨的第三方库”,但six
不是“花哨的”;)然而,我不知道它在嵌入式系统上的开销是多少。
发布于 2019-03-22 00:34:31
我不知道有什么真正的版本“不可知”的方式来做这件事,但下面的方法似乎非常接近这个理想,并且在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'
https://stackoverflow.com/questions/55283710
复制相似问题