为了账号安全,请及时绑定邮箱和手机立即绑定

使用 python 生成器访问 json 对象

使用 python 生成器访问 json 对象

森栏 2023-01-04 10:17:53
这是我的 sql 表(2700 万行)的导出示例,如下所示:test.json{    "table": "table",    "rows":    [        {            "state": "UNKNOWN"        },        {            "state": "IE"        }    ]}这是我试图用来在 elasticsearch 中加载表的生成器函数filename='test.json'def load_json(filename):    with open(filename,'r') as open_file:        yield json.load(open_file)['rows']我收到以下错误:TypeError: pop() takes at most 1 argument (2 given)在我的生成器函数上运行next(load_json(filename))时,这是输出。[{'state': 'UNKNOWN'}, {'state': 'IE'}]如您所见,它正在返回一个list,这是导致错误的原因。有人可以解释我如何正确访问我的 json 以及为什么我的方法不正确。
查看完整描述

2 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

你产生了一个列表,所以你不能使用dict.pop. 在您的情况下,您应该这样编写代码:


def load_json(file_name):

    with open(filename,'r') as open_file:

        for row in json.load(open_file)['rows']:

            yield row

这意味着,一旦你加载了一个新行,你将跳转到其他函数来处理该值。然后你可以在下面弹出。


for row in load_json(file_name):

    print(row.pop('state'))

但是,还是要告诉你,这种方式并不能优化你的代码,因为json.load会一次性读取整个文件,所以还是会消耗很大的内存...


你说你用的是 elasticsearch,那你最好用 pagination 本身,而不是 generator。


查看完整回答
反对 回复 2023-01-04
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

您很可能希望遍历行并像这样一一输出它们:


filename='test.json'

def load_json(filename):

    with open(filename,'r') as open_file:

        for r in json.load(open_file)['rows']:

            yield r 

目前你只产生一件事——整个列表。因此,由您的原始函数创建的迭代器将返回一个完整列表作为第一个元素,然后停止。


查看完整回答
反对 回复 2023-01-04
  • 2 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号