Python загружает json файл с заголовком спецификации UTF-8
Мне нужно было разбирать файлы, созданные другим инструментом, который безошибочно выводит json файл с заголовком спецификации UTF-8 (EFBBBF). Вскоре я обнаружил, что это проблема, поскольку модуль Python 2.7 не может ее разобрать:
>>> import json
>>> data = json.load(open('sample.json'))
ValueError: No JSON object could be decoded
Удаление спецификации, решает ее, но мне интересно, есть ли другой способ разбора json файла с заголовком спецификации?
Ответы
Ответ 1
Вы можете открыть с помощью codecs
:
import json
import codecs
json.load(codecs.open('sample.json', 'r', 'utf-8-sig'))
или декодировать с помощью utf-8-sig
самостоятельно и перейти к loads
:
json.loads(open('sample.json').read().decode('utf-8-sig'))
Ответ 2
Так как json.load(stream)
использует json.loads(stream.read())
под капотом, не так уж плохо писать небольшую функцию hepler, которая строит спецификацию:
from codecs import BOM_UTF8
def lstrip_bom(str_, bom=BOM_UTF8):
if str_.startswith(bom):
return str_[len(bom):]
else:
return str_
json.loads(lstrip_bom(open('sample.json').read()))
В других ситуациях, когда вам нужно обернуть поток и исправить его, вы можете посмотреть на наследование с codecs.StreamReader
.
Ответ 3
Вы также можете сделать это с ключевым словом с
import codecs
with codecs.open('samples.json', 'r', 'utf-8-sig') as json_file:
data = json.load(json_file)
или лучше:
import io
with io.open('samples.json', 'r', encoding='utf-8-sig') as json_file:
data = json.load(json_file)
Ответ 4
Если это одноразовое, очень простое супер высокотехнологичное решение, которое сработало для меня...
- Откройте JSON файл в вашем любимом текстовом редакторе.
- Select-все
- Создать новый файл
- Вставить
- Сохранить.
BOOM, заголовок спецификации пропал!
Ответ 5
Просто! Вам даже не нужно импортировать codecs
.
with open('sample.json', encoding='utf-8-sig') as f:
data = json.load(f)