我正在尝试创建一个进度条,以便使用 tqdm 将 excel 数据读入 pandas。我可以像这样使用 chunksize 参数使用 csv 轻松地做到这一点:
data_reader = pd.read_csv(path,
chunksize = 1000)
for row in tqdm(data_reader,
total = 200):
df_list = []
df_list.append(row)
它会为 200 个总 block 中的每 1000 个 block 更新进度条。但是,pd.read_excel
不再有 chunksize
参数。有替代方案吗?
编辑:我读过问题 re: reading an excel file in chunks ( Reading a portion of a large xlsx file with python ),然而,read_excel 不再有 chunksize 参数和 pd.ExcelFile。 parse
是等价的。我想知道是否有 chunksize
参数的替代方法或另一种方法来创建可迭代对象以在读取 block 时循环 block 。
如果你想添加一个进度指示器,你可以使用文件对象的.tell()
方法。这当然不太准确,但也许它可以让您的用户足够准确地估计他们可以喝多长时间的咖啡:-)
计划如下:基本上使用open
打开您的excel 文件并将结果对象传递给pd.read_excel
。根据文档,这应该是可能的,我只是用一个 xlsx 文件的简单示例验证了它。
开始时,您评估文件的大小。例如:
import io
fp.seek(0, io.SEEK_END) # set the file cursor to the end of the file
fp_len= fp.tell()
fp.seek(0, io.SEEK_SET) # set the file cursor back to the beginning of the file
使用此设置,您有两种可能性:
- 要么创建一个线程,通过在文件对象上调用
fp.tell()
不时更新进度条,您为 xlsx 文件打开,或者
- 创建自己的包装器,提供方法,pandas 需要读取数据(至少一个
read
方法)并同步更新进度条,因此您不需要额外的线程。您的类只需要将方法调用传递给实际的文件类。从这个意义上说,您可以将它与代理对象进行比较。
我不得不承认,2 有点脏。但我确信这两种方法都有效,因为我刚刚验证过,pd.read_excel
确实可以从文件对象 (io.BufferedReader
) 以及 xlsx 文件中读取,这是 afaik 压缩文件。这种方法不会那么准确,因为文件指针可能不会随时间线性移动,具体取决于压缩率的波动(文件的某些部分可能比其他部分以更高的速率压缩)。