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

为何Dask读取JSON.gz文件返回嵌套列表?如何转为字典列表?

Dask读取JSON.gz文件返回嵌套列表的解决方案

我来帮你搞定这个问题,同时解释为什么会出现嵌套列表的情况:

解决方法

你有两种简单的方式得到期望的单层字典列表:

方法1:用flatten()展平嵌套结果

既然map(json.loads)返回的是包含整个字典列表的单个元素,我们可以用Dask Bag的flatten()方法把这个嵌套列表展开成单层元素:

import json
import gzip
import dask.bag as db

dict_list = [{'id': 123, 'name': 'lemurt', 'indices': [1,10]}, {'id': 345, 'name': 'katin', 'indices': [2,11]}]
filename = './test.json.gz'

# 写入测试文件
with gzip.open(filename, 'wt') as write_file:
    json.dump(dict_list , write_file)

# 读取并展平
data_dask = db.read_text(filename).map(json.loads).flatten().compute()
print(data_dask)
# 输出:[{'id': 123, 'name': 'lemurt', 'indices': [1, 10]}, {'id': 345, 'name': 'katin', 'indices': [2, 11]}]

方法2:直接使用db.read_json(更推荐)

Dask提供了专门的JSON读取函数db.read_json,它能自动识别文件中的JSON数组结构,直接返回单层的Bag,不需要手动处理map和展平:

data_dask = db.read_json(filename).compute()
print(data_dask)
# 输出:[{'id': 123, 'name': 'lemurt', 'indices': [1, 10]}, {'id': 345, 'name': 'katin', 'indices': [2, 11]}]

原因解释

为什么db.read_text(filename).map(json.loads)会返回嵌套列表?

  • db.read_text的核心逻辑是按行读取文件内容,把每一行作为Bag的一个元素。你的测试文件里,整个字典列表是作为单个JSON对象存储的(整个文件只有一行内容,这行就是列表的JSON字符串),所以读取后Bag里只有一个元素。
  • 当你对这个元素调用json.loads时,会解析出原来的字典列表,此时Bag里的元素就变成了这个列表本身。所以compute()后得到的结果就是一个包含这个列表的列表,也就是你看到的嵌套结构。

而db.read_json会自动检测文件中的JSON格式,无论是每行一个JSON对象(JSON Lines)还是整个文件是一个JSON数组,都能正确将每个字典作为独立的Bag元素返回,这是处理JSON数据更高效、更省心的方式。

内容的提问来源于stack exchange,提问作者Nico De Tullio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:01:03