Python使用UTF-8 BOM头加载json文件

时间:2012-10-31 11:01:29

标签: python json

我需要解析由其他工具生成的文件,这些文件无条件地输出带有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文件?

7 个答案:

答案 0 :(得分:61)

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

答案 1 :(得分: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

答案 2 :(得分:1)

您也可以使用关键字 with

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)

答案 3 :(得分:1)

简单!您甚至不需要导入logger.debug( 'finished descrambling signature for itag=%s\n%s', stream['itag'], pprint.pformat( { 'url': stream['url'], 'signature': signature, }, indent=2, ), )

cascade=CascadeType.ALL

答案 4 :(得分:1)

我正在使用utf-8-sig和导入json

with open('estados.json', encoding='utf-8-sig') as json_file:
data = json.load(json_file)
print(data)

答案 5 :(得分:0)

如果这是一次性的,一个非常简单的超高科技解决方案对我有用......

  • 在您喜欢的文本编辑器中打开JSON文件。
  • 选择-所有
  • 创建新文件
  • 粘贴
  • 保存。

BOOM,BOM标题消失了!

答案 6 :(得分:0)

我使用Linux命令手动删除了BOM。

首先,我检查文件中是否有efbb bf个字节,其中包含head i_have_BOM | xxd

然后我运行dd bs=1 skip=3 if=i_have_BOM.json of=I_dont_have_BOM.json

bs=1每次处理1个字节,skip=3跳过前3个字节。