我试图创建一个进度条,用于使用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,以便在读取块时循环块。
如果要添加进度指示器,可以使用文件对象的. 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
使用此设置,您有两种可能:
fp.tell()
不时更新进度条,您为xlsx文件打开,或read
方法)并同步更新进度条,所以你不需要额外的线程。类只需要将方法调用传递给实际的文件类。从这个意义上说,您可以将其与代理对象进行比较。我得承认,2有点脏。但我确信这两种方法都能奏效,因为我刚刚验证了pd。read_excel
确实可以读取文件对象(io.BufferedReader
),也可以读取xlsx文件,这是一种AIK压缩文件。这种方法就不那么准确了,因为文件指针可能不会随着时间线性移动,这取决于压缩率的波动(文件的某些部分可能比其他部分的压缩率更高)。
你能做的最好的事情是使用pandas.read_excel与skiprows(从文件顶部跳过行)和skip_footer(从底部跳过行)参数。然而,这将首先将整个文件加载到内存,然后只解析所需的行。
该参数存在,但它从未做任何事情,因此被删除。在github上查看此问题。
正如其他人所指出的那样,你需要采取不同的方法来做到这一点。