Python: 解析函数中的进度条?

Python: Progress bar in parse function?

我之前成功地使用 tdqm 为简单的 for 循环设置了一个进度条,但现在我正在尝试做一些稍微不同的事情:

我有一个 xml 文件,其中包含多个项目,我正在将其解析为一个函数以提取特定信息,然后将其转换为数据帧。所以我有一个大致如下所示的函数:

def parse_record(xml):
      
    ns = {"marc":"http://www.loc.gov/MARC21/slim"}

    #ID:      
    id = xml.findall("marc:controlfield[@tag = '001']", namespaces=ns)
    try:
        id = id[0].text
    except:
        id = 'fail'
        
    #Creator: 
    creator = xml.findall("marc:datafield[@tag = '100']/marc:subfield[@code = 'a']", 
         namespaces=ns)

    if creator:
        creator = creator[0].text
    else:
        creator = "fail"

    gathered = {'ID':id, 'Creator':creator}
    
    return gathered

然后我调用此函数循环遍历主 xml 文件中的所有单个项目并将其转换为数据帧:

result = [parse_record(item) for item in records]
df = pd.DataFrame(result)
df

一切正常,但我不确定如何设法让进度条包含在整个过程中,因为 for 循环不是独立的。

如果我将 tdqm 位添加到函数中,它显然只会计数为 1,但会重复数百次(取决于 xml 文件包含的项目数)。我还没有设法将它包含到解析部分。

如有任何帮助,我们将不胜感激!

你几乎只需要打破你的列表理解。我将在这里使用 Enlighten,但您可以使用 tqdm 完成同样的事情。

import enlighten

records: list = ...

manager = enlighten.get_manager()
pbar = manager.counter(total=len(records), desc='Parsing records', unit='records')

result = []
for item in records:
    result.append(parse_record(item))
    pbar.update()

df = pd.DataFrame(result)

如果 records 是一个生成器而不是一个可迭代的,你需要先用 list()tuple() 包装它,这样你才能得到长度。