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

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

最佳答案

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

相关文章:

python - 'str' 对象没有属性 'punctuation'

python - 如何从使用多处理运行脚本的 python2 子进程获取输出?

python - 字典更新序列元素错误

c# - 如何使用 FileHelpers 库从 csv 中只读取一定数量的字段?

python - BeautifulSoup 中带有 .get-operator 的 if 语句

performance - Oracle:同一服务器上的数据库之间的性能差异为 300 倍

c# - 使用 Oracle.ManagedAccess 使用存储过程执行内联语句

oracle - 无法连接到 Oracle XE 11g2

python - 将 xml 文件解析为 csv 时跳过空元素

Python:根据第一列和第二列向csv文件添加列