openpyxl iterate through cells of column => TypeError: 'generator' object is not subscriptable

openpyxl iterate through cells of column => TypeError: 'generator' object is not subscriptable

i 我想遍历列中的所有值,以将它们作为字典中的键来保护。据我所知,一切都很好,但python不同意。

所以我的问题是:"what am i doing wrong?"

>>> 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

我一定是漏掉了什么,但经过几个小时的尝试,我必须投入力量并召集骑兵 ;)

在此先感谢您的帮助!

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

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

for cell  in sheet.columns[1:]:

所以,虽然它可以解决我的问题,但它会在几行之后在我的代码中返回给我。我会在我的代码中使用你的建议来提取密钥。

我最关心的问题是:

为什么它不起作用,我确定我以前使用过这个代码片段,这也是谷歌搜索时人们建议这样做的方式。

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

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

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

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

显然,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

我是新手,但是我根据openpyxl文档想到了以下代码来打印列的单元格内容:

x = sheet.max_row + 1

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