[ОБНОВЛЕНО] Я собрал все, что я знаю о проверке адреса электронной почты здесь: http://isemail.info , который теперь не только проверяет, но и диагностирует проблемы с адресами электронной почты. Я согласен со многими комментариями здесь, что валидация является лишь частью ответа; см. мое эссе в http://isemail.info/about .
is_email () остается, насколько я знаю, единственным валидатором, который окончательно скажет вам, будет ли данный строка является действительным адресом электронной почты или нет. Я загрузил новую версию на http://isemail.info/
Я собрал тестовые примеры от Cal Henderson, Dave Child, Phil Haack, Doug Lovell, RFC5322 и RFC 3696. Всего 275 тестовых адресов. Я проверил все эти тесты со всеми бесплатными валидаторами, которые мог найти.
Я постараюсь сохранить эту страницу в актуальном состоянии, так как люди повышают эффективность своих валидаторов. Спасибо Cal, Michael, Dave, Paul и Phil за помощь и сотрудничество в компиляции этих тестов и конструктивной критике моего собственного валидатора .
Люди должны знать о ошибки в RFC 3696 в частности. Три из канонических примеров на самом деле являются неверными адресами. И максимальная длина адреса составляет 254 или 256 символов, а не 320.
Python 3 декодирует текстовые файлы при чтении. Кодировка по умолчанию взята из locale.getpreferredencoding(False)
, что, очевидно, для вашей установки возвращает 'ASCII'
. См. Функцию documenation open()
функции :
В текстовом режиме, если кодировка не указана, используемая кодировка зависит от платформы:
blockquote>locale.getpreferredencoding(False)
вызывается, чтобы получить текущую кодировку локали.Вместо того, чтобы полагаться на системный параметр, вы должны открыть свои текстовые файлы, используя явный кодек:
currentFile = open(filename, 'rt', encoding='latin1')
где вы устанавливаете параметр
encoding
в соответствии с файлом, который вы читаете.Python 3 поддерживает UTF-8 как значение по умолчанию для исходного кода .
То же самое относится к записи в текстовый файл для записи; записанные данные будут закодированы, и если вы будете полагаться на системную кодировку, вы можете получить исключения
UnicodeEncodingError
, если вы явно не установите подходящий кодек.Вы можете прочитать на Python 3 и Unicode в Unicode HOWTO , который объясняет как кодирование исходного кода, так и чтение и запись данных Unicode.
«Насколько я знаю, Python3 должен поддерживать utf-8 всюду ...» Неверно. У меня есть python 3.6, и моя кодировка по умолчанию НЕ utf-8. Чтобы изменить его на utf-8 в моем коде, я использую:
import locale
def getpreferredencoding(do_setlocale = True):
return "utf-8"
locale.getpreferredencoding = getpreferredencoding
, как описано в Изменение «предпочтительной кодировки языка» в Python 3 в Windows