Enumerate循环中TQDM进度条无法达到100%问题求助
问题原因
进度条无法走满的核心问题是进度更新和终止判断的执行顺序错误,加上终止条件阈值设置不当:
- enumerate从0开始计数,你设置的终止条件为
i > numTweets,实际会收集到numTweets + 1条数据,且进度更新会多执行2次,和预设的total值不匹配 - 你先执行进度更新,再做终止判断,如果爬虫迭代过程中因为网络波动、接口限流、目标内容不足等原因提前终止,就会出现进度没有走到预设值的情况
- 循环结束后没有手动关闭进度条,tqdm的输出缓冲可能会导致最终进度没有刷新到100%
修复方案
调整判断顺序、修正终止阈值,循环结束后手动关闭进度条即可:
if __name__ == '__main__': data = [] numTweets = 50 pbar = tqdm(total=numTweets, desc='Collecting Tweets') for i, tweet in enumerate(sntwitter.TwitterSearchScraper('COVID Vaccine since:2021-01-01 until:2021-05-31').get_items()): # 先判断是否达到采集数量上限,达到就直接终止 if i >= numTweets: break # 再更新进度、处理数据 pbar.update(n=1) data.append([tweet.date, tweet.id, tweet.content]) # 确认是可采集内容不足导致进度不满时,可取消下一行注释强制补满进度 # pbar.update(pbar.total - pbar.n) # 手动关闭进度条,刷新最终状态 pbar.close()
更简便的写法
你也可以直接把迭代器传入tqdm,不需要手动调用update方法,避免顺序写错的问题:
if __name__ == '__main__': data = [] numTweets = 50 scraper = sntwitter.TwitterSearchScraper('COVID Vaccine since:2021-01-01 until:2021-05-31').get_items() for i, tweet in enumerate(tqdm(scraper, total=numTweets, desc='Collecting Tweets')): if i >= numTweets: break data.append([tweet.date, tweet.id, tweet.content])
内容的提问来源于stack exchange,提问作者Deemo
相关产品推荐
相关产品推荐

