使用alive_progress为pandas读取CSV及for循环添加进度条的实现方法
CSV读取进度条不结束的原因及修复方案
你当前代码进度条一直处于加载状态的核心原因是:alive_bar(100)定义了总进度为100个单位,但你仅调用了1次bar(),仅完成了1个单位的进度,剩余99个单位未被确认,因此进度条会一直停留在待完成状态。同时pandas默认的read_csv是一次性加载全量文件,本身没有进度回调逻辑,直接套在上下文管理器外无法获取实时读取进度。
根据你的需求可以选择两种修复方案:
方案1:仅需标记读取完成,无需实时进度
如果不需要显示读取过程中的实时进度,只需要读取完成后进度条同步结束,可以直接将alive_bar的总进度值设为1:
import pandas as pd from alive_progress import alive_bar with alive_bar(1, theme='ascii') as bar: file = pd.read_csv('file.csv', sep = ';', skiprows = 56, parse_dates = [['Date','Time']]) bar()
方案2:显示CSV读取的实时进度
如果需要同步显示读取进度,需要用read_csv的chunksize参数分块加载文件,每读取一块更新一次进度:
import pandas as pd from alive_progress import alive_bar # 先统计有效数据总行数(扣除要跳过的前56行) total_rows = sum(1 for _ in open('file.csv', 'r')) - 56 # 单块读取行数,可根据文件大小自行调整 chunk_size = 1000 df_chunks = [] with alive_bar(total_rows, theme='ascii') as bar: # 分块读取CSV for chunk in pd.read_csv('file.csv', sep = ';', skiprows = 56, parse_dates = [['Date','Time']], chunksize=chunk_size): df_chunks.append(chunk) # 按当前块的行数更新进度 bar(len(chunk)) # 合并所有块得到完整DataFrame file = pd.concat(df_chunks, ignore_index=True)
for循环添加进度条的方法
alive_progress原生支持for循环场景,两种常用实现方式:
方式1:自动适配迭代对象
直接把要遍历的可迭代对象传入alive_bar,不需要手动调用更新方法,进度会自动更新:
from alive_progress import alive_bar import time # 遍历的同时自动更新进度 for item in alive_bar(range(100), theme='ascii'): # 此处为循环业务逻辑 time.sleep(0.05)
方式2:手动控制进度
适合循环次数不固定、需要自定义进度增量的场景:
from alive_progress import alive_bar import time total_task = 50 with alive_bar(total_task, theme='ascii') as bar: for i in range(total_task): # 此处为循环业务逻辑 time.sleep(0.1) # 手动更新1个单位的进度 bar()
内容的提问来源于stack exchange,提问作者Sultry T.
相关产品推荐
相关产品推荐

