我如何使用Python字符串,以便相同的代码在2.6,2.7,3.x中工作

时间:2013-07-29 23:39:24

标签: python python-2.7 python-3.x

我想编写一些简单的Python脚本,可以在不同的Python版本上不加修改地使用,但是我遇到字符串问题......

text = get_data()  
phrases = [ "Soggarth Eogham O'Growney ,克尔・德怀尔", "capitis #3 病态上升涨大的繁殖性勃现", "IsoldeIsult、第一任威尔士亲王" ]  
for item in phrases:  
    if item not in text:  **# 3.3 ok.  2.7 UnicodeDecodeError**
        print ("Expected phrase '" + item + "' not found")  

上面的代码适用于3.3。当我尝试在2.7下运行时,我得到了

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 27: ordinal not in range(128)

通过将第一行更改为

可以轻松解决此问题
text = get_data().encode('utf-8')

但是,这不适用于3.3。有没有办法使用一个版本的源代码? Python noob。

1 个答案:

答案 0 :(得分:3)

似乎get_data()将返回Unicode字符串。您收到错误是因为您将Unicode字符串与8位字符串连接起来,强制转换,默认情况下将使用ASCII编解码器完成,并且由于数据包含非ascii字符,因此失败。

让上述代码工作的最好方法是确保所有字符串都是Unicode,前缀为u“”:

phrases = [ u"Soggarth Eogham O'Growney ,克尔・德怀尔", 
            u"capitis #3 病态上升涨大的繁殖性勃现", 
            u"IsoldeIsult、第一任威尔士亲王" ]  

但是,这只适用于Python 2.x和Python 3.3。如果你需要使用Python 3.2或3.1,你需要有一个方法,使它在Python 2下成为Unicode,但在Python 3下不会做任何事情(因为它已经是Unicode)。

这样的函数通常称为u(),你可以像这样定义它:

import sys
if sys.version < '3':
    import codecs
    def u(x):
        return codecs.unicode_escape_decode(x)[0]
else:
    def u(x):
        return x