我之前已經成功地使用 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 檔案包含多少項)。我還沒有設法將它包含到決議部分。
任何幫助將非常感激!
uj5u.com熱心網友回復:
你幾乎只需要打破你的串列理解。我將在這里使用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()or包裝它,tuple()以便獲得長度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/461358.html
下一篇:確定最適合字串的數值變數型別
