13

我正在尝试创建一个进度条,用于使用 tqdm 将 excel 数据读入 pandas。我可以使用 csv 使用 chunksize 参数轻松地做到这一点,如下所示:

data_reader = pd.read_csv(path,
                          chunksize = 1000)

for row in tqdm(data_reader,
                total = 200):
    df_list = []
    df_list.append(row)

它会更新 200 个总块中每 1000 个块的进度条。pd.read_excel,然而,不再有chunksize论据。有替代方案吗?

编辑:我已经阅读了问题 re: reading an excel file in chunks ( Reading a part of a large xlsx file with python ),但是,read_excel不再有 chunksize 参数并且pd.ExcelFile.parse是等效的。我想知道是否有chunksize参数的替代方法或另一种方法来创建可迭代的以在读取块时循环它们。

4

3 回答 3

0

如果要添加进度指示器,可以使用.tell()文件对象的方法。这当然不是很准确,但也许它可以让您的用户足够准确地估计他们可以休息多长时间:-)

所以这是计划:基本上打开你的 excel 文件open并将结果对象传递给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

使用此设置,您有两种可能性:

  1. fp.tell()您可以创建一个线程,通过调用文件对象不时更新进度条,为 xlsx 文件打开,或者
  2. 创建自己的包装器,提供方法,熊猫需要读取数据(至少一个read方法)并同步更新进度条,因此您不需要额外的线程。您的类只需要将方法调用传递给实际的文件类。从这个意义上说,您可以将其与代理对象进行比较。

我不得不承认,这 2 有点脏。但我确信这两种方法都行得通,因为我刚刚验证过,它pd.read_excel确实可以从文件对象 ( io.BufferedReader) 中读取,也可以从 xlsx 文件中读取,这些文件是 afaik 压缩文件。这种方法不会那么准确,因为文件指针可能不会随时间线性移动,这取决于压缩率的波动(文件的某些部分可能比其他部分可以以更高的速率压缩)。

于 2019-07-24T21:44:51.370 回答
0

那个参数在那里,但它从来没有做任何事情,所以它被删除了。在 github 上查看此问题

正如其他人指出的那样,您需要采取不同的方法来做到这一点。

于 2020-11-25T17:10:57.953 回答
0

您可以做的最好的事情是将 pandas.read_excel 与 skiprows(从文件顶部跳过行)和 skip_footer(从底部跳过行)参数一起使用。但是,这将首先将整个文件加载到内存中,然后仅解析所需的行。

于 2020-03-10T08:47:40.123 回答