Python:比较字符串的稳健方法
我有一个CSV文件被读入到Python中,然后我把读取的内容保存成一个数组(我想是这样)。
接着,我把CSV文件的结果和一些Oracle数据库的结果进行比较:
readerSetSAP = []
readerSAP = csv.reader(StringIO.StringIO(request.POST['sap'].value),dialect=csv.excel)
readerSetSAP.extend(readerSAP)
empsTbl = meta.Session.query(model.Person).all();
然后我使用一个嵌套循环来进行比较:
if i.userid != currEmp[0].strip():
updated = True
print "userid update"
问题是,我经常会收到这样的警告:
eWarning: Unicode unequal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
所以我的问题是:
在Python中,比较这种类型的字符串最可靠的方法是什么?
1 个回答
你遇到的问题不是“比较字符串的可靠方法”。在Python中,比较字符串的可靠方法是使用等于运算符 ==
。你真正的问题是你的数据在某个地方被转换成了Unicode,而你并没有意识到这一点。
你和其他所有写代码的人都应该知道,文本不是ASCII编码的——在1990年之后的世界里就是这样。即使你的应用程序只使用英语,并且永远不会在国际环境中运行,你也会在某些人的名字中,或者像“resumé”这样的单词中发现一些非ASCII字符。
下面是一个Python控制台的例子,说明问题可能发生的情况:
>>> "maçã" == u"maçã"
__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
False
Python的CSV模块不会自动转换,它处理的是字节字符串(也就是说,字符串已经被转换成某种编码)——这意味着你从数据库中获取的结果是Unicode格式的。可能你的连接使用了一些默认设置。
要解决这个问题,假设你数据库中的数据格式正确(并且在插入时没有丢失字符信息),你需要使用明确的编码来解码从CSV文件中读取的字符串——这样两者都将是Unicode(Python内部对编码不敏感)的字符串格式。
>>> "maçã".decode("utf-8") == u"maçã"
True
因此,你需要在从CSV文件读取的字符串上使用“decode”方法,以便在比较之前进行正确的转换。如果你在Windows上,解码时使用“cp1251”。在其他主流操作系统上,应该使用“utf-8”。
我建议你阅读这篇文章——非常有用: http://www.joelonsoftware.com/articles/Unicode.html