Подтвердить что ты не робот

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 файла с заголовком спецификации?

4b9b3361

Ответ 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)