2012-01-19 2 views
2

У меня есть файл csv, который считывается в python, тогда я сохраняю читателя как массив (я думаю).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?

+1

Можете ли вы привести пример, когда появляется это предупреждение? Мое первое предложение состоит в том, что вы должны быть уверены, что оба аргумента одинаково закодированы. Поэтому вам нужно знать, как кодируются входные данные, чтобы правильно преобразовать их в Юникод. –

+0

Вы оставляете некоторые важные подсказки. Какой модуль вы используете для чтения базы данных Oracle - что означает «meta.Session.query»? Как ваш код цикла установлен I и currEmp? Каков тип поля БД, задающего currEmp [0]? –

+0

Проверьте этот ответ о том, как понимать unicode в Python: http://stackoverflow.com/a/1818326/244672 Надеюсь, это поможет. –

ответ

4

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

Вы и все, кто пишет код, должны знать, что текст не ASCII, а не в мире пост 1990. Даже если все ваше приложение ограничено только английским языком и никогда не должно запускаться в среда интернационала, вы должны найти некоторые символы, отличные от ASCII, в именах людей или в словах типа «resumé».

H прежде чем консольная Python пример, когда проблема может произойти:

>>> "maçã" == u"maçã" 
__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 
False 

модуль CSV в Python не делают никакого authomatic преобразования, и работает с байтовыми strigns (то есть - strigns aready преобразуется в какую кодировку) - это означает, что этот результат вы извлекаете из БД в Юникоде. Вероятно, ваше соединение используется по умолчанию.

Чтобы решить эту проблему, если данные в вашей базе данных правильно отформатированы (и вы еще не потеряли информацию о символах во время вставки), необходимо декодировать строку, считанную из файла CSV, с использованием явного кодирования - так, чтобы оба в юникод (внутреннее кодирование агностик Пайтона) формат строки -

>>> "maçã".decode("utf-8") == u"maçã" 
True 

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

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

Смежные вопросы