首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与Python版本无关的字符串处理

与Python版本无关的字符串处理
EN

Stack Overflow用户
提问于 2019-03-21 23:16:32
回答 2查看 221关注 0票数 0

我可以接受字符串和字节数组的区别。Python3区分字符串和字节,而python2则不太清楚。很好。考虑下面这两行代码:

代码语言:javascript
运行
复制
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

我想编写一些代码来转换ab,并返回字节/字符串(在python2中)或字节数组(在python3中)。(预期结果是将-seen作为ASCII AAABBB)

换句话说,我想要一个python版本不可知的代码行,等同于:

代码语言:javascript
运行
复制
result = a+b #returns a string/bytes in python2

代码语言:javascript
运行
复制
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询问的尝试:

代码语言:javascript
运行
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2019-03-21 23:27:58

我建议看看six,这是一个专门设计用来处理Python2和Python3之间(一些)差异的Python模块。特别是,ensure_binary函数(请参阅https://six.readthedocs.io/#six.ensure_binary)可以解决您的问题。

请注意,我知道您希望避免依赖“花哨的第三方库”,但six不是“花哨的”;)然而,我不知道它在嵌入式系统上的开销是多少。

票数 0
EN

Stack Overflow用户

发布于 2019-03-22 00:34:31

我不知道有什么真正的版本“不可知”的方式来做这件事,但下面的方法似乎非常接近这个理想,并且在Python 2.7.16和3.7.2中都有效:

代码语言:javascript
运行
复制
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'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55283710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档