实现读取csv文件的进度条alive_progress

Implement the progressing bar reading a csv file alive_progress

我正在尝试在读取我的 csv 文件时在我的代码中实现一个进度条(我也想在其他函数中实现它)。

但是,我不确定如何将这段代码实现到我阅读的代码中,因为它一直在进步,而且永无止境

import pandas as pd
from alive_progress import alive_bar
import time

with alive_bar(100, theme='ascii') as bar:

    file = pd.read_csv('file.csv', 
                        sep = ';', 
                        skiprows = 56,
                        parse_dates = [['Date','Time']])
    bar()

而且,如果我想将进度条应用于 for 循环会怎样?

How do I add a progress bar to this?

一般来说,对于进度条,您需要某种方式来为实际的读取循环添加一个挂钩。在这种情况下,我根本不会打扰:如果你打算使用像 pandas 这样的高级库,大概是因为你 不想 想要管理整个自己阅读-解析循环。

How do I use a for loop?

这就容易多了。来自文档:

from alive_progress import alive_it

for item in alive_it(items):   # <<-- wrapped items
    print(item)                # process each item

Why doesn't my bar update?

因为您只调用了一次 bar(),这是更新柱的函数。 alive_progress 不是魔法:如果您告诉它您将需要 100 次迭代,它希望您调用 bar() 100 次。每次它都会将条形图向前移动 1/100,并且从调用到 bar() 之间的时间,它会计算出你前进的速度以及你可能需要等待多长时间。

您必须分块解析文件并事先获取行数以计算总块数:

import pandas as pd
from alive_progress import alive_bar

filepath = "file.csv"

num_lines = sum(1 for _ in open(filepath, 'r'))
chunksize = 5000

reader = pd.read_csv(filepath, chunksize=chunksize)

with alive_bar(int(num_lines/chunksize)) as bar:
    for chunk in reader:
        process_chunk()
        bar()
        

行计数当然会浪费很多时间,所以我只在处理时间比读取本身长得多并且你绝对必须有进度条时才推荐这样做。