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()
包装它,这样你才能得到长度。
我之前成功地使用 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()
包装它,这样你才能得到长度。