Ваша проблема здесь не в «надежном способе» сравнения строк. Надежным способом сравнения стрингов в 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