如何使用tqdm实现JSON文件加载进度条?

3

我正在编写一个用于JSON文件处理的Python脚本。它基本上分为三个步骤:加载、编码和打印。虽然我已经使用tqdm轻松地为编码和打印创建了进度条,但是我不知道如何为加载创建进度条。

我仔细阅读了tqdm文档并进行了搜索,但没有任何提示。

import json
from tqdm import tqdm, trange
from iso3166 import countries

geo_json_events_path = r'/cygdrive/c/elastic/gtd.geojson'

with open(geo_json_events_path) as f:
    data = json.load(f)

我希望能够展示json.load()方法的进度条。
2个回答

5

知道了!

json.load()方法中使用object_hook参数。我已经尝试使用一个简单的计数函数与之配合,该函数返回的值是源文件行数的三倍,所以我认为这个方法是错误的。当我理解到我的函数针对json.load返回的每个字典都被执行一次时,我意识到我的函数没问题,只需要找到正确的嵌套层数来获取期望的迭代。以下是最终结果:

from tqdm import tqdm
import json

def hook(obj):
    value = obj.get("features")
    if value:
    pbar = tqdm(value)
    for item in pbar:
        pass
        pbar.set_description("Loading")
    return obj

f = open('/cygdrive/c/elastic/gtd_tst.geojson')
docs = json.load(f, object_hook=hook)
for doc in docs:
    print(doc)

这篇文章中的第一个答案对于查找解决方案非常有帮助:Python解码嵌套的JSON数据


谢谢,这对初学者来说非常有用。 - Phillip

0
这是一个稍微通用一些的解决方案,用于导入具有多个对象的json文件:
def hook(obj):
    for key, value in obj.items():
        pbar = tqdm(value)
        if type(value) is list:
            for _ in pbar:
                pbar.set_description("Loading " + str(key))
    return obj

f = open(r"C:\my_json_file.json")
my_json_file = json.load(f, object_hook=hook)

虽然它仍然无法显示嵌套对象的总进度,只能显示当前对象的导入进度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接