Во-первых, исправление: укажите encoding='UTF-8-sig'
при чтении файла.
Теперь объяснение:
\ufeff
- символ Unicode BOM (метка порядка байтов) . Всякий раз, когда один инструмент записывает файл с спецификацией, а другой инструмент читает файл, используя явную кодировку, такую как UTF-16-LE
вместо версии с переключением спецификации, такой как UTF-16
, спецификация обрабатывается как обычный символ, поэтому \ufeff
показывает в вашей строке. Вне Microsoft-land эта конкретная проблема (читается как UTF-16 как UTF-16-LE) на сегодняшний день является наиболее распространенной версией этой проблемы.
Но если один из инструментов от Microsoft, это чаще всего UTF-8. Стандарт Unicode рекомендует никогда не использовать спецификацию с UTF-8 (поскольку байты не нуждаются в метке порядка байтов), но не совсем запрещает это, поэтому многие инструменты Microsoft продолжают это делать. И затем любой другой инструмент, включая Python (и Pandas), просто читает его как UTF-8 без спецификации, в результате чего появляется дополнительный \ufeff
. (Старые, не поддерживающие Юникод инструменты будут читать те же три байта \xef\xbb\xbf
, что и что-то вроде 
, что вы, возможно, видели несколько раз.)
Но хотя Python (и Pandas) по умолчанию равен UTF-8, он позволяет вам указать кодировку вручную, и одна из кодировок, с которой он поставляется, называется UTF-8-sig
, что означает UTF-8 с бесполезной спецификацией в начале.