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?
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'))
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
.
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!