Openpyxl如何按索引从工作表中获取行

Posted

技术标签:

【中文标题】Openpyxl如何按索引从工作表中获取行【英文标题】:Openpyxl How to get row from worksheet by index 【发布时间】:2017-03-26 11:48:45 【问题描述】:

使用 Openpyxl 和 python3.5,我尝试使用下标从 excel 工作表中获取第一行,但出现错误。

# after getting filename
# after loading worksheet
# to get the first row of the worksheet
first_row = worksheet.rows[0]

# I get 
Traceback (most recent call last):
      File "<pyshell#54>", line 1, in <module>
      first_row = phc_th_sheet.rows[1]
TypeError: 'generator' object is not subscriptable

关于获得第一行,我也尝试过 first_row = 工作表。(行=1) # 和 first_row = worksheet.rows[:1]

没有工作。有什么建议或该功能在 openpyxl 中不可用吗? 我去过https://openpyxl.readthedocs.io/en/default/ 的文档,但我发现没有足够的帮助来索引和选择行

【问题讨论】:

这在文档中有介绍。 【参考方案1】:

我终于在文档中找到了答案:

first_row = worksheet[1]
# worksheet[row_index_from_1]

这对我有用。

【讨论】:

是的,我们将ws.rows 转换为生成器,以便不同实现之间的行为保持一致,并鼓励这种语法用于临时查询。最好使用ws.iter_rows()ws.iter_cols() 进行编程访问。 现在是 worksheet.rows[1]。将更新答案。 @CharlieClark 在rows 变量之后是一个生成器,我们现在还有办法按索引访问行吗? @BenLiyanage:我已经回滚了你的编辑。我怀疑您使用的是旧版本的openpyxlworksheet.rows 是一个生成器,所以 worksheet.rows[1] 不起作用。 这在最新版本中不再有效【参考方案2】:

错误TypeError: 'generator' object is not subscriptable。意味着您试图通过索引访问一个没有生成器的生成器,因为它会在您遍历它时创建元素。

你可以很容易地解决它,将它转换为一个列表以获得你想要的元素:

first_row = list(worksheet.rows)[0]

或迭代认为行:

for row in worksheet.rows:
    foo(row)

这是因为,即使两者都是可迭代的,列表和生成器的行为也可能完全不同,您可以在这里得到更好的解释:

https://wiki.python.org/moin/Generators

https://docs.python.org/3/library/stdtypes.html#iterator-types

https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range

【讨论】:

这不是一个很好的答案。最好直接获取行,而不是将迭代器显式转换为列表。 当然可以。但是,由于我通常使用 pandas 操作 excel 电子表格,并且我不熟悉 openpyxl 的内部结构,因此只是试图解释错误以及如何解决。 @BenLiyanage 问题是你不能,因为该方法现在是一个生成器。 list 方法模拟直接访问行。请注意,它首先将所有数据拉入内存。像 DOM 和 StaX 考虑一样,如果您有一个大型数据集,您将希望使用第二个示例进行迭代。 是的,我修正了另一个答案。 =D 快乐的 bug 狩猎家伙! 我了解@ebt 的解释生成器,但我仍然无法理解如何使用答案中提供的“第二个示例”访问第 n 行。

以上是关于Openpyxl如何按索引从工作表中获取行的主要内容,如果未能解决你的问题,请参考以下文章

复制单元格样式openpyxl

openpyxl数据存储

python的openpyxl库怎么读取一行或者一列

在另一个工作表中复制匹配的行

如何从 SQL Server 中的表中获取行的索引?

用python从符合一定格式的txt文档中逐行读取数据并按一定规则写入excel(openpyxl支持Excel 2007 .xlsx格式)