我需要解析由其他工具生成的文件,这些文件无条件地输出带有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文件?
答案 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)
如果这是一次性的,一个非常简单的超高科技解决方案对我有用......
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个字节。