【问题标题】:Is there a chunksize argument for read_excel in pandas? [duplicate]熊猫中的 read_excel 是否有 chunksize 参数? [复制]
【发布时间】:2017-11-29 14:22:37
【问题描述】:

我正在尝试创建一个进度条,用于使用 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 portion of a large xlsx file with python),但是,read_excel not 不再有 chunksize 参数,pd.ExcelFile.parse 是等效的。我想知道是否有 chunksize 参数的替代方法或另一种方法来创建可迭代以在读取块时对其进行循环。

【问题讨论】:

  • 这是重复的,请参阅this question 以获得答案。
  • @VinceP 不是重复的,请阅读编辑。这些答案不起作用,因为不再有 chunksize 参数。我正在寻找替代品。
  • 我从未见过大于内存的 Excel 文件。出于好奇,用例是什么?
  • @AndrewL 我的代码被用于自动化一些基本的重复 ETL 函数以用于工作。它提取了一本需要处理的医疗索赔书以及一些其他数据,以在索赔被人类触及之前进行过滤、分析、细分等。该 excel 文件有 105 列,大约 2000 行,因此读入大约需要一分钟。没有转换为 csv 以使其更快的选项。我想把导入过程变成一个可迭代的,这样我就可以用 tqdm 向用户显示一个进度条。 read_csv 让我这样做(如问题中所述),但 read_excel 没有。
  • 更多的是 UX 舒适而不是必需品,如果我只是将数据提取出来进行分析,那将是一回事,但我的非技术同事对等待比我更恼火,特别是因为这对他们来说是每周两次的过程。

标签: python pandas tqdm


【解决方案1】:

如果要添加进度指示器,可以使用文件对象的.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. 要么创建一个线程,通过在文件对象上调用 fp.tell() 来不时更新进度条,要么为 xlsx 文件打开,或者
  2. 创建自己的包装器,提供方法,pandas 需要读取数据(至少一个read 方法)并同步更新进度条,所以你不需要额外的线程。您的类只需要将方法调用传递给实际的文件类。从这个意义上说,您可以将其与代理对象进行比较。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      那个参数在那里,但它从来没有做任何事情,所以它被删除了。 See this issue on github.

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-15
        • 2019-05-24
        • 1970-01-01
        • 1970-01-01
        • 2020-01-02
        • 1970-01-01
        • 1970-01-01
        • 2016-12-27
        相关资源
        最近更新 更多