Python加载带有UTF-8bom头的json文件

2024-06-07 03:40:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要解析其他工具生成的文件,它无条件地输出带有UTF-8bom头(EFBBBF)的json文件。我很快发现问题出在这里,因为Python2.7模块似乎无法解析它:

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

ValueError: No JSON object could be decoded

删除BOM,解决了这个问题,但我想知道是否有其他方法可以解析带有BOM头的json文件?


Tags: 模块文件工具samplenoimportjsondata
3条回答

因为json.load(stream)在引擎盖下使用json.loads(stream.read()),所以编写一个小的hepler函数来表示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继承。

您也可以使用关键字

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)

您可以使用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'))

相关问题 更多 >