我有一个 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 中比较这种类型的字符串最可靠的方法是什么?
最佳答案
这里的问题不是比较字符串的“可靠方法”。Python 中比较字符串的可靠方法是相等运算符 ==
-
你的问题是你的数据在某个地方被转换为 Unicode,而你却没有意识到这一点。
您和所有其他编写代码的人都应该意识到文本不是 ASCII - 在 1990 年后的世界中不是这样。即使您的所有应用程序都仅限于英语,并且永远不应在国际环境中运行,您也一定会在人名或“简历”等单词中找到一些非 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 文件读取的字符串使用“解码”方法,以便进行 proepr 转换。如果您使用的是 Windows,请使用“cp1251”进行解码。,在任何其他主流(应用程序)操作系统中。它应该是“utf-8”。
我建议阅读这篇文章 - 它相当有用: http://www.joelonsoftware.com/articles/Unicode.html
关于Python:比较字符串的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8925312/