Судя по вашим комментариям, ваша проблема в том, что к вашему файлу добавлена UTF-8 BOM . Это означает, что дополнительные три байта 0xEF 0xBB 0xBF
находятся первыми в вашем файле.
Модуль Python json
Документация говорит, что он не принимает спецификацию. Поэтому вы должны удалить его перед передачей данных JSON в json.load
или json.loads
.
Существует как минимум три способа удаления спецификации. Лучше всего просто отредактировать файл JSON, чтобы удалить его. Если это невозможно, вы можете пропустить это в своем коде Python.
Если ваш код нужен только для работы с файлами, содержащими спецификацию, вы можете использовать:
assert b'\xEF\xBB\xBF' == sys.stdin.buffer.read(3)
Это гарантирует, что удаленные байты действительно были спецификацией UTF-8.
Если вам нужно работать с файлами, которые могут содержать или не содержать спецификацию, вы можете заключить в стандартный поток ввода TextIOWrapper
с правильной кодировкой, как указано в этого ответа . Тогда код выглядит так:
import io
stdin_wrapper = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8-sig')
# use stdin_wrapper instead of stdin
Цитировать Python Unicode HOWTO , почему utf-8-sig
:
В некоторых областях также принято использовать «спецификацию» в начале файлов в кодировке UTF-8; имя вводит в заблуждение, поскольку UTF-8 не зависит от порядка байтов. Знак просто объявляет, что файл закодирован в UTF-8. Для чтения таких файлов используйте кодек utf-8-sig, чтобы автоматически пропустить метку, если она есть.