提问者:小点点

熊猫read_excel有大块的说法吗?[重复]


我试图创建一个进度条,用于使用tqdm将excel数据读取到熊猫中。我可以使用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个区块中每1000个区块的进度条<代码>pd。但是,read_excel不再有chunksize参数。还有别的选择吗?

编辑:我已经阅读了以下问题:以块形式读取excel文件(使用python读取大型xlsx文件的一部分),但是,read_excel不再有chunksize参数和pd。ExcelFile。parse是等效的。我想知道是否有一种替代chunksize参数的方法,或者另一种方法来创建一个iterable,以便在读取块时循环块。


共3个答案

匿名用户

如果要添加进度指示器,可以使用文件对象的. show()方法。这当然不太准确,但也许它能给你的用户足够的准确性来估计,他们可以Rest多长时间:-)

计划如下:基本上用open打开excel文件,并将结果对象传递给pd。阅读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文件,这是一种AIK压缩文件。这种方法就不那么准确了,因为文件指针可能不会随着时间线性移动,这取决于压缩率的波动(文件的某些部分可能比其他部分的压缩率更高)。

匿名用户

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

匿名用户

该参数存在,但它从未做任何事情,因此被删除。在github上查看此问题。

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