2024-06-07 03:40:19 发布
网友
我需要解析其他工具生成的文件,它无条件地输出带有UTF-8bom头(EFBBBF)的json文件。我很快发现问题出在这里,因为Python2.7模块似乎无法解析它:
>>> import json >>> data = json.load(open('sample.json')) ValueError: No JSON object could be decoded
删除BOM,解决了这个问题,但我想知道是否有其他方法可以解析带有BOM头的json文件?
因为json.load(stream)在引擎盖下使用json.loads(stream.read()),所以编写一个小的hepler函数来表示BOM并没有那么糟糕:
json.load(stream)
json.loads(stream.read())
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继承。
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打开:
codecs
import json import codecs json.load(codecs.open('sample.json', 'r', 'utf-8-sig'))
或者用utf-8-sig自己解码并传递给loads:
utf-8-sig
loads
json.loads(open('sample.json').read().decode('utf-8-sig'))
因为
json.load(stream)
在引擎盖下使用json.loads(stream.read())
,所以编写一个小的hepler函数来表示BOM并没有那么糟糕:在其他需要包装流并以某种方式修复它的情况下,可以考虑从
codecs.StreamReader
继承。您也可以使用关键字和
或者更好:
您可以使用
codecs
打开:或者用
utf-8-sig
自己解码并传递给loads
:相关问题 更多 >
编程相关推荐