(Python/tqdm) 使用 Pandas 时在计时器中获取所有零

(Python/tqdm) Getting all zeros in timer when working with Pandas

我试图在文件加载到 pandas 时显示进度条。但我得到的只是这个。

0it [00:00, ?it/s]

这是我正在使用的代码。
我正在根据我找到的一些示例导入 tqdm。

from tqdm import tqdm
...

def function(self):
    params = self.getGuiParams()
    filename = params['fileNameLineEdit']
    keyname = params['dataSetNameLineEdit']
    try:
        print('Loading data file: ' + str(filename))
        self.datakeys.append(keyname)
        chunksize = 50000
        df = tqdm(pd.read_csv(filename, header=[0, 1], chunksize=chunksize, iterator=True))
        self.data[keyname] = spectral_data(df)
    except Exception as e:
        print('Problem reading data: {}'.format(e))

tqdm 需要迭代器。当您对 read_csv 使用 iterator=True 选项时,您将生成的 TextFileReader 对象分配回 df,而没有实际迭代它。

试试这样的东西:

tfr = pd.read_csv(filename, header=[0, 1], chunksize=chunksize, iterator=True
with tqdm() as pbar:
  # do something with the chunk
  pbar.update()

我从未使用过 tqdm,因此它可能无法开箱即用 - 您可能需要计算文件大小以及需要多少块等。

除了手动更新 tqdm 进度条的另一个答案之外,我想推荐一个可能更直观的替代方案:

text_file_reader = pd.read_csv(filename, chunksize=chunksize, iterator=True)
for chunk in tqdm(text_file_reader):
    # chunk is a pd.DataFrame with *chunksize* rows of pd.read_csv(filename)
    # (the last chunk might have fewer rows)

    # do something with the chunk

这不会给你一个标准的进度条慢慢填充到 100%。相反,您将获得有关已经处理了多少块以及它们的平均处理时间是多少的信息:像这样:

18/? [00:22<00:00, 1.29s/it]

也许可以用有意义的数据填充进度条 - 然而,正如我所见,这需要根据文件大小估计一些数量或行数,这对我来说似乎并不重要。