0

每当将文件加载到熊猫中时,我都会尝试显示进度条。但我得到的只是这个。

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))
4

2 回答 2

1

除了手动更新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]

一个人可能能够用有意义的数据填充进度条 - 但是,正如我所看到的,这需要从文件大小中估计某种数量或行数,这对我来说似乎并不简单。

于 2020-07-29T14:43:58.300 回答
1

tqdm需要一个迭代器。当您使用 的iterator=True选项时read_csv,您将结果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,因此它可能无法开箱即用 - 您可能需要计算文件大小以及需要多少块等。

于 2017-09-06T20:40:06.590 回答