首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有UTF-8 BOM头的Python加载json文件

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

Stack Overflow用户
提问于 2012-10-31 19:01:29
回答 7查看 63.9K关注 0票数 52

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

代码语言:javascript
复制
>>> import json
>>> data = json.load(open('sample.json'))

ValueError: No JSON object could be decoded

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-10-31 19:20:32

您可以使用codecs打开

代码语言:javascript
复制
import json
import codecs

json.load(codecs.open('sample.json', 'r', 'utf-8-sig'))

或者自己使用utf-8-sig解码并传递给loads

代码语言:javascript
复制
json.loads(open('sample.json').read().decode('utf-8-sig'))
票数 87
EN

Stack Overflow用户

发布于 2019-06-07 06:38:16

很简单!您甚至不需要导入codecs

代码语言:javascript
复制
with open('sample.json', encoding='utf-8-sig') as f:
    data = json.load(f)
票数 24
EN

Stack Overflow用户

发布于 2012-10-31 19:21:33

由于json.load(stream)在幕后使用了json.loads(stream.read()),所以编写一个小的hepler函数来剥离BOM并不是件坏事:

代码语言:javascript
复制
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继承。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13156395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档