迭代 Excel 文件的迭代器

Posted

技术标签:

【中文标题】迭代 Excel 文件的迭代器【英文标题】:Iterator to iterate over Excel file 【发布时间】:2015-12-07 23:48:51 【问题描述】:

我有一些数据存储在 Excel 表 (.xlsx) 中,我当前的 Python 脚本将它们读入内存并用于计算。我会用一个例子来解释我的脚本。

假设我的 excel 文件在特定列下有这些数据:a = [1,2,3,4,5]

我正在使用 pandas (pd.read_excel()) 将整个内容读入内存并运行我自己的迭代器函数来获取:

a0 = [1,2,3,4,5]
a1 = [5,1,2,3,4]
a2 = [4,5,1,2,3]

等等。基本上我将每个元素移动了一些整数。 a0, a1a2 这里显示为列表,但它们是迭代器对象,我不存储它们。

正如您在此处注意到的,a0 始终与 a 相同,并且我真的不需要将 a 存储在内存中,因为我只需要它一次,这就是 a0 所做的。所以我想做的是让某种迭代器对象直接迭代excel文件以捕获a0, a1a2,就像我首先导入a然后迭代a0, a1, a2而不是a .

我尝试这样做的原因是,我的脚本计算所需的时间比从 Excel 导入数据所需的时间短。因此,为了提高脚本的性能,我需要找到一种方法来迭代 Excel,而不是将数据保存到内存中。我将不胜感激。

另外,我的评论:如果pandas 或其他一些库具有readThisCell() 类的功能,我可以轻松地制作自己的excel 迭代器。但我不知道我对 pandas 或任何其他库的选择是什么。

【问题讨论】:

试试:pd.read_excel("your_file",skiprows=1)@Deniz 【参考方案1】:

我没有使用 pandas read_excel 函数的经验,但我们使用 openpyxl 取得了很好的成功。该库允许您定义一个指向特定工作表的变量,然后迭代该变量,如下所示(直接来自their tutorial):

from openpyxl import load_workbook
wb = load_workbook(filename='large_file.xlsx', read_only=True)
ws = wb['big_data'] # ws is now an IterableWorksheet

for row in ws.rows:
    for cell in row:
        print(cell.value)

【讨论】:

我阅读了 openpyxl.load_workbook() 的文档,它看起来就像我正在寻找的一样。但是,当我使用此示例时,它会引发TypeError: load_workbook() got an unexpected keyword argument 'read_only'。我删除了read_only 参数,它开始引发KeyError: 'Worksheet big_data does not exist.'。我可以看到您直接从他们的网站复制了该示例,因此它应该可以工作,但是是的,我遇到了这两个错误。感谢您的回复。 @Deniz - 将big_data 替换为您的工作表名称,它应该可以工作。您首先加载工作簿,然后加载工作表,然后您可以遍历那里的行和单元格。 是的,这在没有 read_only 参数的情况下有效。不过我有一个担忧:文档说没有read_only arg,而是use_iterators (bool) arg,用于延迟迭代。当我简单地将其设置为True 时,我遇到了一个奇怪的错误。我可以忍受这一点,但遗憾的是,文档的这种模糊性让我在使用这个库时三思而后行。我将进一步测试这个库,看看它是否能让我实现我正在寻找的性能提升。然后,我将在此处添加我的 openpyxl 迭代器脚本,并在一切正常的情况下将您的答案标记为已接受。谢谢。 即使认为 openpyxl 只是迭代,它仍然比 pandas 读取和打印慢。这是我的比较脚本:https://repl.it/BHRf/2。如您所见,pandas 将其读入内存然后打印,这在 0.77 秒内完成。 openpyxl 仅迭代打印,耗时 1.95 秒。不幸的是,这并没有让我获得一些性能提升。我做错了吗? @Deniz - 我无法真正谈论性能,我们的用例涉及非常小的文件。出于某种原因,我无法加载 repl 链接,但我看到了数字。不知道如何使用它。

以上是关于迭代 Excel 文件的迭代器的主要内容,如果未能解决你的问题,请参考以下文章

迭代器

迭代器

迭代器

Python基础之迭代器

迭代器

Pythonrange函数用法完全解读