Python:比较字符串的可靠方法

Jac*_*ero 2 python csv oracle

我有一个 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 中比较这种类型的字符串最可靠的方法是什么?

jsb*_*eno 5

您在这里的问题不是“比较字符串的可靠方法”。在 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