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:我已经回滚了你的编辑。我怀疑您使用的是旧版本的openpyxl
。 worksheet.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如何按索引从工作表中获取行的主要内容,如果未能解决你的问题,请参考以下文章
用python从符合一定格式的txt文档中逐行读取数据并按一定规则写入excel(openpyxl支持Excel 2007 .xlsx格式)