【问题标题】:Python: Robust way to compare stringsPython:比较字符串的可靠方法
【发布时间】:2012-02-14 01:38:19
【问题描述】:

我有一个 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();

然后使用嵌套循环进行比较:

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

【问题讨论】:

  • 你能举一个出现警告的例子吗?我的第一个建议是你必须确定两个参数是否同样编码。所以你需要知道输入数据是如何编码的,才能正确地转换成unicode。
  • 您遗漏了一些相关线索。您使用什么模块来读取 Oracle 数据库——“meta.Session.query”指的是什么?您的循环代码如何设置 I 和 currEmp?提供 currEmp[0] 的 DB 字段的类型是什么?
  • 查看这个关于如何在 Python 中理解 unicode 的答案:stackoverflow.com/a/1818326/244672希望这会有所帮助。

标签: python oracle csv


【解决方案1】:

您的问题不是比较字符串的“稳健方法”。在 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 文件读取的字符串使用“解码”方法,以便进行正确的转换。如果您在 Windows 上,请使用“cp1251”进行解码。在任何其他主流(应用程序)操作系统中。它应该是“utf-8”。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2011-01-04
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    相关资源
    最近更新 更多