You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何打开读取JSON文件?186MB大体积JSON文件Python读取报错求助

嘿,我来帮你搞定这两个问题!先从基础的JSON读取方法说起,再针对性解决你遇到的大文件报错问题~

一、基础:如何打开并读取JSON文件

Python读取JSON文件有两种常用方式,核心是区分json.load()和json.loads()的用法:

  • 使用json.load()直接读取文件对象(推荐)
    这种方法更简洁,还能借助with语句自动管理文件资源,避免忘记关闭文件:

    import json
    
    with open('file.json', 'r', encoding='utf-8') as f:
        data = json.load(f)
    

    json.load()会直接从打开的文件对象中解析JSON数据,不需要手动读取整个文件内容。

  • 使用json.loads()读取文件内容字符串
    如果你需要先读取文件内容再解析,要确保整个字符串是单个有效的JSON结构(比如一个对象或数组):

    import json
    
    with open('file.json', 'r', encoding='utf-8') as f:
        content = f.read()
        data = json.loads(content)
    
二、解决你的186MB JSON文件报错问题

你遇到的ValueError: Extra data,核心原因是你的JSON文件不是单一的有效JSON结构——比如它可能是多个JSON对象直接拼接(比如{"a":1}{"b":2}),或者是每行一个独立JSON的JSON Lines格式。再加上文件体积达186MB,一次性读取会占用大量内存,所以推荐用流式/逐行处理的方式。

下面分两种常见情况给出解决方案:

情况1:文件是JSON Lines格式(每行一个独立JSON)

这种格式非常常见,比如导出的批量数据、日志文件等,每行都是一个完整的JSON对象。可以逐行读取解析,内存占用极低:

import json

data_list = []
with open('file.json', 'r', encoding='utf-8') as f:
    for line in f:
        # 跳过可能存在的空行
        stripped_line = line.strip()
        if not stripped_line:
            continue
        try:
            item = json.loads(stripped_line)
            data_list.append(item)
        except json.JSONDecodeError as e:
            print(f"解析行时出错: {e}")

情况2:文件是多个JSON对象直接拼接(无换行)

如果你的文件是类似{"a":1}{"b":2}这种没有分隔的拼接格式,手动分割会很麻烦,推荐用ijson库做流式解析,它会逐块读取文件并解析,完全不需要加载整个文件到内存:
首先安装ijson:

pip install ijson

然后用流式解析的方式处理:

import ijson

with open('file.json', 'rb') as f:
    # 流式读取每个顶级JSON对象
    for item in ijson.items(f, ''):
        # 这里可以对每个item做处理,比如存入数据库、分析数据等
        print(item)

额外小贴士

  • 处理大文件时,绝对不要一次性用f.read()读取整个文件,会导致内存占用过高甚至崩溃。
  • 始终用with语句打开文件,它会在代码块结束后自动关闭文件,避免资源泄漏。
  • 如果不确定文件格式,可以用文本编辑器打开文件的前几行,确认是单一JSON、JSON Lines还是拼接格式。

内容的提问来源于stack exchange,提问作者user8588162

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:03:41