Строки (тип str
) в Python 2.7 являются байтами.Когда вы читаете текст из файла, вы получаете байты, возможно, с окончаниями строк.Следовательно, s
не является экземпляром типа unicode
.
. На str
тесты, подобные isalnum()
, предполагают, что строка является текстом ASCII.ASCII определен только для кодов от 0 до 127. Python не имеет представления и не может знать, какие символы представлены значениями вне этого диапазона, поскольку кодировка неизвестна.é
не является символом ASCII и поэтому не считается буквенно-цифровым.
То, что вы хотите сделать, - это декодировать прочитанную вами строку байта в строку Unicode:
u = s.decode("utf8")
(при условии, что строка записана в файл в кодировке UTF8, если это не сработает, вы можете попробовать latin1
или cp437
... последнее - это то, что мой терминал дает мне в Windows 10)
Когда вы это сделаете, u[0].isalnum()
будет True
, а isinstance(u, unicode)
также True
.
Python 3 работает немного по-другому.Вы должны указать Python, какую кодировку использовать при открытии файла.Затем он переводит строки в Unicode из этой кодировки, когда вы их читаете.Все строки в Python 3 являются Unicode;есть отдельный тип bytes
для байтовых строк.Возможно, вам следует использовать Python 3 по многим другим причинам, но его более согласованная обработка текста, безусловно, является одной из этих причин.