我有一个 csv 文件被读入 python,然后我将读取器保存为一个数组(我猜)。
然后我将 csv 文件结果与一些 Oracle db 结果进行比较:
readerSetSAP = []
readerSAP = csv.reader(StringIO.StringIO(request.POST['sap'].value),dialect=csv.excel)
readerSetSAP.extend(readerSAP)
empsTbl = meta.Session.query(model.Person).all();
Run Code Online (Sandbox Code Playgroud)
然后使用嵌套循环进行比较:
if i.userid != currEmp[0].strip():
updated = True
print "userid update"
Run Code Online (Sandbox Code Playgroud)
问题是,我经常收到警告:
eWarning: Unicode unequal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
在 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
Run Code Online (Sandbox Code Playgroud)
Python 的 CSV 模块不进行自动转换,并使用字节字符串(即 - 字符串区域转换为某种编码) - 这意味着您从数据库中获取的结果是 Unicode。可能您的连接正在使用一些默认值。
为了解决这个问题,假设您的数据库中的数据格式正确(并且您在插入过程中没有丢失字符信息),就是使用显式编码对从 CSV 文件读取的字符串进行解码 - 以便两者都采用 unicode( Python 的内部编码不可知)字符串格式 -
>>> "maçã".decode("utf-8") == u"maçã"
True
Run Code Online (Sandbox Code Playgroud)
因此,在比较之前,您确实对从 CSV 文件读取的字符串使用了“解码”方法,以便进行 proepr 转换。如果您在 Windows 上,请使用“cp1251”进行解码。在任何其他主流(应用程序)操作系统中,它应该是“utf-8”。
我建议阅读这篇文章 - 它相当有用:http : //www.joelonsoftware.com/articles/Unicode.html