Python: надежный способ сравнения строк - PullRequest
2 голосов
/ 19 января 2012

У меня есть файл 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?

1 Ответ

4 голосов
/ 19 января 2012

Ваша проблема здесь не в «надежном способе» сравнения строк. Надежным способом сравнения стрингов в Python является оператор равенства == - Ваша проблема в том, что ваши данные куда-то передаются в Unicode без вашего ведома.

Вы и все, кто пишет код, должны знать, что текст не является ASCII - не в мире после 1990 года. Даже если все ваше приложение ограничено только английским языком и никогда не должно запускаться в среде internatiol, вы обязательно найдете некоторые не-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

Итак, вы используете метод decode для чтения строки из CSV-файла, чтобы выполнить преобразование proepr, прежде чем сравнивать его. Если вы работаете в Windows, используйте «cp1251» для декодирования. В любом другом основном потоке (приложении) O.S. это должно быть "UTF-8".

Я бы посоветовал прочитать этот кусок - он довольно полезен: http://www.joelonsoftware.com/articles/Unicode.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...