Why does my openpyxl WorkBook.active() give me a TypeError: Object is not callable?
Why does my openpyxl WorkBook.active() give me a TypeError: Object is not callable?
我是第一次尝试 openpyxl。我有一个 excel 文件,其中包含两列数据。 'A' 列有 ID 号,而 'C' 列有值。我只是想将它们提取为普通的 key/value 对象。
这些是我认为我需要实施的伪步骤
- 按位置查找文件,并创建工作簿对象
- 定义一个工作表对象。在我的例子中,这是默认的第一页
- 遍历行,只要列中有键值 'A'
- 将 'A' 和 'C' 中的键和值添加到一个对象中。
问题是我无法通过第 2 步,即创建工作表。 ws = wb.active()
行似乎是获取默认工作表的完全标准化方式。我看到它用在很多例子中,在撰写本文时,有 93 个关于 SO 使用该行的问题。但就我而言,它会引发错误:
File "C:\myworkspace\Myclass.py", line 18, in <module>
ws = wb.active()
TypeError: 'ReadOnlyWorksheet' object is not callable
我对 Python 很陌生,但我以前 运行 遇到过类似的错误。我知道如果我导入 python 模块名称而不是相关的 class 名称,则会抛出它。这里究竟发生了什么?为什么这种看似标准的检索工作表对象的方法试图实例化模块而不是 class?我用错了吗?
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'))]))
只是为了让这真的很奇怪,我向你展示这个:
我想以最简单的方式重现我的错误,所以我找到了最短的示例,并将其复制到我的工作区中。除了文件路径外,这与 Ryu_Hayabusa 对这个问题的回答完全相同:parsing excel documents with python。现在得到这个:它有效,没有任何错误!
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(文件名= file_url , use_iterators = True )
是问题所在,但不是。删除粗体标记的文本,使其与工作示例相同,仍然会产生错误。唯一的区别是现在它说的是 Worksheet
而不是 ReadOnlyWorksheet
大世界里发生了什么???
在 openpyxl 中,wb.active 由图书馆作为 属性 提供给您当前活动的工作表。因此,您无需添加 ()
即可将其作为函数调用。
ws = wb.active
你的缩减示例是正确的。
我是第一次尝试 openpyxl。我有一个 excel 文件,其中包含两列数据。 'A' 列有 ID 号,而 'C' 列有值。我只是想将它们提取为普通的 key/value 对象。
这些是我认为我需要实施的伪步骤
- 按位置查找文件,并创建工作簿对象
- 定义一个工作表对象。在我的例子中,这是默认的第一页
- 遍历行,只要列中有键值 'A'
- 将 'A' 和 'C' 中的键和值添加到一个对象中。
问题是我无法通过第 2 步,即创建工作表。 ws = wb.active()
行似乎是获取默认工作表的完全标准化方式。我看到它用在很多例子中,在撰写本文时,有 93 个关于 SO 使用该行的问题。但就我而言,它会引发错误:
File "C:\myworkspace\Myclass.py", line 18, in <module>
ws = wb.active()
TypeError: 'ReadOnlyWorksheet' object is not callable
我对 Python 很陌生,但我以前 运行 遇到过类似的错误。我知道如果我导入 python 模块名称而不是相关的 class 名称,则会抛出它。这里究竟发生了什么?为什么这种看似标准的检索工作表对象的方法试图实例化模块而不是 class?我用错了吗?
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'))]))
只是为了让这真的很奇怪,我向你展示这个:
我想以最简单的方式重现我的错误,所以我找到了最短的示例,并将其复制到我的工作区中。除了文件路径外,这与 Ryu_Hayabusa 对这个问题的回答完全相同:parsing excel documents with python。现在得到这个:它有效,没有任何错误!
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(文件名= file_url , use_iterators = True )
是问题所在,但不是。删除粗体标记的文本,使其与工作示例相同,仍然会产生错误。唯一的区别是现在它说的是 Worksheet
而不是 ReadOnlyWorksheet
大世界里发生了什么???
在 openpyxl 中,wb.active 由图书馆作为 属性 提供给您当前活动的工作表。因此,您无需添加 ()
即可将其作为函数调用。
ws = wb.active
你的缩减示例是正确的。