53

UTF-8 BOM ヘッダー (EFBBBF) を持つ json ファイルを無条件に出力する他のツールによって生成されたファイルを解析する必要がありました。Python 2.7モジュールはそれを解析できないように見えるため、これが問題であることがすぐにわかりました。

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

ValueError: No JSON object could be decoded

BOMを削除すれば解決するのですが、BOMヘッダ付きのjsonファイルを解析する別の方法はないでしょうか?

4

7 に答える 7

88

あなたはで開くことができます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'))
于 2012-10-31T11:20:32.277 に答える
5

json.load(stream)内部で使用するためjson.loads(stream.read())、BOMを削除する小さなヘプラー関数を作成することはそれほど悪くありません。

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

于 2012-10-31T11:21:33.327 に答える
4

キーワードを使用して行うこともできます

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)
于 2019-03-30T15:24:49.093 に答える
0

import json だけで utf-8-sig を使用しています

with open('estados.json', encoding='utf-8-sig') as json_file:
data = json.load(json_file)
print(data)
于 2020-06-10T11:20:43.023 に答える