openpyxl遍历column =>的单元格TypeError:'generator'对象不可订阅

时间:2016-09-24 18:11:47

标签: python excel loops openpyxl

我想在列中循环所有值,以将它们作为dict中的键来保护。据我所知,一切都很好,但是python不同意。

所以我的问题是:“我做错了什么?”

>>> wb = xl.load_workbook('/home/x/repos/network/input/y.xlsx')
>>> sheet = wb.active
>>> for cell  in sheet.columns[0]:
...     print(cell.value)
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'generator' object is not subscriptable

我必须遗漏一些东西,但经过几个小时的尝试,我必须扔进拖车并打电话给cavalecry;)

提前感谢所有帮助!

=============================================== ====================

@Charlie Clark:谢谢你花时间回答。问题是,我需要第一列作为词典中的键,之后,我需要做

for cell  in sheet.columns[1:]:

所以,虽然它会解决我的问题,但在我的代码中,它会在几行之后回到我身边。我将在我的代码中使用您的建议来提取密钥。

我最常问的是:

为什么它不起作用,我确信我之前使用过此代码片段,这也是谷歌搜索时人们建议如何使用它。

=============================================== ===========================

>>> for column in ws.iter_cols(min_col = 2):
...     for cell in column:
...             print(cell.value)

遍历工作表的所有列,第一个除外。现在,我仍然需要排除前3行

3 个答案:

答案 0 :(得分:4)

ws.columns返回一个列生成器,因为这在大型工作簿上更有效,就像你的情况一样:你只需要一列。 Version 2.4现在提供了直接获取列的选项:ws['A']

答案 1 :(得分:4)

显然,在我不知情的情况下,openpyxl模块已升级到2.4。

>>> for col in ws.iter_cols(min_col = 2, min_row=4):
...     for cell in col:
...         print(cell.value)

应该做的伎俩。 我发布了这个以防其他人正在寻找相同的答案。

iter_cols(min_col=None, max_col=None, min_row=None, max_row=None)[source]

Returns all cells in the worksheet from the first row as columns.

If no boundaries are passed in the cells will start at A1.

If no cells are in the worksheet an empty tuple will be returned.
Parameters: 

    min_col (int) – smallest column index (1-based index)
    min_row (int) – smallest row index (1-based index)
    max_col (int) – largest column index (1-based index)
    max_row (int) – smallest row index (1-based index)

Return type:    

generator

答案 2 :(得分:0)

我是新手,但我想出了基于openpyxl文档的以下代码,打印出一列的单元格内容:

x = sheet.max_row + 1

for r in range(1,x):
    d=sheet.cell(row=r,column=2)
    print(d.value)