pandas中是否有read_excel的chunksize参数?

时间:2017-06-26 17:02:57

标签: python pandas tqdm

我正在尝试创建一个进度条,用于使用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个总块中每个块的1000个进度条。但是,pd.read_excel不再有chunksize个参数。还有其他选择吗?

编辑:我已经阅读了问题:在块中读取excel文件(使用python读取大型xlsx文件的一部分),但是,read_excel 已经有了chunksize参数了pd.ExcelFile.parse是等价的。我想知道是否有替代chunksize参数或另一种方法来创建一个迭代来循环读取块。

3 个答案:

答案 0 :(得分:0)

如果要添加进度指示器,可以使用文件对象的.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

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

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

我必须承认,2很脏。但是我坚信这两种方法都可以使用,因为我刚刚验证过,pd.read_excel确实可以从文件对象(io.BufferedReader)中读取,也可以从alfik压缩文件xlsx文件中读取。这种方法只是不够精确,因为文件指针可能不会随时间线性移动,具体取决于压缩率的波动(文件的某些部分可能以更高的压缩率)。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

该参数在那里,但是它什么也没做,因此将其删除。 See this issue on github

正如其他人指出的那样,您需要采取其他方法。