亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 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 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號