为什么我的openpyxl WorkBook.active(file_name)给了我一个TypeError:Object是不可调用的?

我正在尝试第一次使用openpyxl。 我有一个Excel文件,有两列数据。 列“A”有ID号码,而“C”列有值。 我只是试图提取它们,作为一个普通的键/值对象。

这些是我想要实现的伪步骤

  • 按位置查找文件,并创build工作簿对象
  • 定义一个WorkSheet对象。 在我的情况下,这是默认的第一页
  • 遍历行,只要列“A”中有关键值
  • 将“A”和“C”中的键和值添加到对象中。

问题是,我不能通过第2步,创build一个工作表。 行ws = wb.active()看起来像是获取默认WorkSheet的完全标准化的方式。 我看到它在很多例子中都被使用了,在写这个的时候,在使用这个命令的时候有93个问题。 但在我的情况下,它会抛出一个错误:

  File "C:\myworkspace\Myclass.py", line 18, in <module> ws = wb.active() TypeError: 'ReadOnlyWorksheet' object is not callable 

我对Python很新,但是之前遇到类似的错误。 我知道,例如,如果我导入一个python模块的名称,而不是相关的类名引发它。 究竟发生了什么? 为什么这个看起来很标准的检索工作表对象的方法,试图实例化一个模块而不是一个类? 我用错了吗?

 file_url = 'C:/myfilepath.xlsx' key_column_index = 1 value_column_index = 3 row_start = 2 request_map = {} wb = load_workbook(filename = file_url, use_iterators = True) ws = wb.active() row_counter = row_start while( ws.cell(row=row_counter, column=key_column_index).value ): key = ws.cell(row=row_counter, column=key_column_index).value value = ws.cell(row=row_counter, column=value_column_index).value request_map[key] = value row_counter += 1 pprint(dict([(n, tuple(l.split(';'))) for n, l in enumerate(requests.split('\n'))])) 

只是为了让这真的很奇怪,我给你这个:

我想以最简单的方式重现我的错误,所以我find了最短的例子,并将其复制到我的工作区中。 除了文件path外,这与Ryu_Hayabusa对这个问题的回答完全相同: 用pythonparsingexcel文档 。 现在得到这个:它的工作原理,没有任何错误!

 file_url = 'C:/myfilepath.xlsx' wb = load_workbook(file_url) ws = wb.active for row in ws.iter_rows(): for cell in row: print cell.value 

当然,我怀疑这个粗体文本在行中

wb = load_workbook( filename = file_url ,use_iterators = True

是问题,但没有。 删除大胆的标记文本,使其与工作示例相同,仍然产生错误。 唯一的区别是现在它说Worksheet而不是ReadOnlyWorksheet什么在这个大广阔的世界正在这里?

在openpyxl中, wb.active由库提供,作为属性给你当前活动的工作表。 因此,您不需要添加()将其作为函数调用。

 ws = wb.active 

你减less的例子正确。