web-dev-qa-db-fra.com

Fichier json de chargement Python avec en-tête de nomenclature UTF-8

J'avais besoin d'analyser les fichiers générés par un autre outil, qui génère sans condition le fichier json avec l'en-tête UTF-8 BOM (EFBBBF). J'ai vite constaté que c'était là le problème, car le module Python 2.7 ne semble pas pouvoir l'analyser:

>>> import json
>>> data = json.load(open('sample.json'))

ValueError: No JSON object could be decoded

Supprimer la nomenclature résout le problème, mais je me demande s’il existe un autre moyen d’analyser un fichier json avec un en-tête de nomenclature?

30
theta

Vous pouvez ouvrir avec codecs:

import json
import codecs

json.load(codecs.open('sample.json', 'r', 'utf-8-sig'))

ou décodez vous-même avec utf-8-sig et passez à loads:

json.loads(open('sample.json').read().decode('utf-8-sig'))
60
Pavel Anossov

Puisque json.load(stream) utilise json.loads(stream.read()) sous le capot, il ne sera pas mauvais d’écrire une petite fonction hepler qui encadre la nomenclature

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()))    

Dans d'autres situations où vous devez encapsuler un flux et le corriger, vous pouvez envisager d'hériter de codecs.StreamReader.

5
newtover

S'il s'agit d'une solution ponctuelle, très simple et d'une technologie de pointe qui a fonctionné pour moi ...

  • Ouvrez le fichier JSON dans votre éditeur de texte préféré.
  • Tout sélectionner
  • Créer un nouveau fichier
  • Coller
  • Sauvegarder.

BOOM, en-tête de nomenclature disparu!

0
Mike N