Python:比较字符串的强大方法

时间:2012-01-19 11:32:21

标签: python oracle csv

我有一个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 个答案:

答案 0 :(得分:4)

这里的问题不是比较字符串的“强大方法”。在Python中比较strigns的一种强大方法是等于运算符== - 您的问题是您的数据正在某个地方与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模块不进行自动转换,并且使用字节标记(即 - strigns转换为某种编码) - 这意味着从数据库中获取的结果是Unicode。可能你的连接使用了一些默认值。

要解决这个问题,假设数据库中的数据格式正确(并且在插入过程中您没有丢失字符信息),则使用显式编码解码从CSV文件读取的字符串 - 这样两者都是在unicode(Python的内部编码不可知)字符串格式 -

>>> "maçã".decode("utf-8") == u"maçã"
True

因此,在比较之前,您要对从CSV文件读取的字符串使用“decode”方法,以便进行proepr转换。如果你在Windows上,使用“cp1251”进行解码。,在任何其他主流(应用程序)O.S.它应该是“utf-8”。

我建议阅读这篇文章 - 它非常有用: http://www.joelonsoftware.com/articles/Unicode.html

相关问题