使用 python 生成器访问 json 对象

这是我的 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)

http://img4.mukewang.com/63b4e1eb0001782613140791.jpg

在我的生成器函数上运行next(load_json(filename))时,这是输出。

[{'state': 'UNKNOWN'}, {'state': 'IE'}]

如您所见,它正在返回一个list,这是导致错误的原因。

有人可以解释我如何正确访问我的 json 以及为什么我的方法不正确。


森栏
浏览 193回答 2
2回答

婷婷同学_

你产生了一个列表,所以你不能使用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。

扬帆大鱼

您很可能希望遍历行并像这样一一输出它们:filename='test.json'def load_json(filename):    with open(filename,'r') as open_file:        for r in json.load(open_file)['rows']:            yield r 目前你只产生一件事——整个列表。因此,由您的原始函数创建的迭代器将返回一个完整列表作为第一个元素,然后停止。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python