为何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
相关产品推荐
相关产品推荐

