Вы писали:
UnicodeEncodeError: 'charmap' codec can't encode character u'\ufeff' in position 0: character maps to <undefined>
Когда вы указываете кодировку "utf-8"
в Python, она берет вас за слово.UTF-8 файлы не должны содержать в себе спецификацию.Они не требуются и не рекомендуются.Endianness не имеет смысла с 8-битными единицами кода.
спецификации запутывают, тоже , потому что вы больше не можете просто сделать:
$ cat a b c > abc
, если эти файлы UTF-8 имеют посторонние (читай: любые) спецификациив них.Теперь вы понимаете, почему спецификации так глупы / плохи / вредны в UTF-8?Они на самом деле ломают вещи.
Спецификация - это метаданные, а не данные, и спецификация кодирования UTF-8 не учитывает их, как это делают спецификации UTF-16 и UTF-32.Итак, Python поверил вам на слово и следовал спецификации.Трудно винить в этом.
Если вы пытаетесь использовать спецификацию в качестве магического номера типа файла для указания содержимого файла, вам действительно не следует этого делать.Вы действительно должны использовать протокол высокого уровня для этих целей метаданных, так же, как вы бы использовали тип MIME.
Это просто еще одна ошибка в Windows, обходной путь которой заключается в использовании альтернативной кодировки "utf-8-sig"
для передачи на Python.