我试图在文件加载到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))
答案 0 :(得分: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,因此可能无法开箱即用 - 您可能需要计算文件大小以及需要多少块。
答案 1 :(得分: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]
一个人也许可以用有意义的数据填充进度条-但是,正如我所看到的,这需要根据文件大小对数字或行数进行某种估算,这对我而言似乎并不重要。