Python charge le fichier json avec L'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 inconditionnellement le fichier json avec L'en-tête de nomenclature UTF-8 (EFBBBF). J'ai vite trouvé que c'était le problème, car le module python 2.7 ne peut pas l'analyser:

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

ValueError: No JSON object could be decoded

Supprimer la nomenclature, le résout, mais je me demande s'il existe une autre façon d'analyser le fichier json avec l'en-tête de nomenclature?

27
demandé sur theta 2012-10-31 15:01:29

3 réponses

Vous pouvez ouvrir avec codecs:

import json
import codecs

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

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

json.loads(open('sample.json').read().decode('utf-8-sig'))
54
répondu Pavel Anossov 2012-10-31 11:25:36

Puisque json.load(stream) utilise json.loads(stream.read()) sous le capot, il ne sera pas si mal d'écrire une petite fonction hepler qui lstrips 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 envelopper un flux et le réparer d'une manière ou d'une autre, vous pouvez hériter de codecs.StreamReader.

5
répondu newtover 2012-10-31 11:21:33

Si c'est un one-off, une solution super high-tech très simple qui a fonctionné pour moi...

  • Ouvrez le fichier JSON dans votre éditeur de texte préféré.
  • Sélectionner-tout
  • Créer un nouveau fichier
  • Coller
  • Enregistrer.

Boum, en-tête de nomenclature parti!

0
répondu Mike N 2017-12-04 08:51:45