首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >getiterator:尝试导入excel文件时,“”ElementTree“”对象没有属性“”getiterator“”

getiterator:尝试导入excel文件时,“”ElementTree“”对象没有属性“”getiterator“”
EN

Stack Overflow用户
提问于 2020-10-08 22:21:20
回答 9查看 18K关注 0票数 25

这是我的代码。我刚刚安装了jupyterlab,并在其中添加了excel文件。如果我将路径更改为文件在系统上的位置,也会出现同样的错误。我似乎找不到任何人在简单地将excel文件作为数据帧导入时遇到同样的问题。

excel文件是一个3x26的表格,其中的studentnr、course、result列的值分别为101-105、A-D、1.0-9.9。也许问题出在excel文件上?

无论哪种方式,我都不知道如何解决这个问题。

代码语言:javascript
运行
复制
import pandas as pd
import numpy as np
df = pd.read_excel('student-results.xlsx')

这是我得到的错误:

代码语言:javascript
运行
复制
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-6-9d38e4d56bbe> in <module>
      1 import pandas as pd
      2 import numpy as np
----> 3 df = pd.read_excel('student-results.xlsx')

c:\python\lib\site-packages\pandas\util\_decorators.py in wrapper(*args, **kwargs)
    294                 )
    295                 warnings.warn(msg, FutureWarning, stacklevel=stacklevel)
--> 296             return func(*args, **kwargs)
    297 
    298         return wrapper

c:\python\lib\site-packages\pandas\io\excel\_base.py in read_excel(io, sheet_name, header, names, index_col, usecols, squeeze, dtype, engine, converters, true_values, false_values, skiprows, nrows, na_values, keep_default_na, na_filter, verbose, parse_dates, date_parser, thousands, comment, skipfooter, convert_float, mangle_dupe_cols)
    302 
    303     if not isinstance(io, ExcelFile):
--> 304         io = ExcelFile(io, engine=engine)
    305     elif engine and engine != io.engine:
    306         raise ValueError(

c:\python\lib\site-packages\pandas\io\excel\_base.py in __init__(self, path_or_buffer, engine)
    865         self._io = stringify_path(path_or_buffer)
    866 
--> 867         self._reader = self._engines[engine](self._io)
    868 
    869     def __fspath__(self):

c:\python\lib\site-packages\pandas\io\excel\_xlrd.py in __init__(self, filepath_or_buffer)
     20         err_msg = "Install xlrd >= 1.0.0 for Excel support"
     21         import_optional_dependency("xlrd", extra=err_msg)
---> 22         super().__init__(filepath_or_buffer)
     23 
     24     @property

c:\python\lib\site-packages\pandas\io\excel\_base.py in __init__(self, filepath_or_buffer)
    351             self.book = self.load_workbook(filepath_or_buffer)
    352         elif isinstance(filepath_or_buffer, str):
--> 353             self.book = self.load_workbook(filepath_or_buffer)
    354         elif isinstance(filepath_or_buffer, bytes):
    355             self.book = self.load_workbook(BytesIO(filepath_or_buffer))

c:\python\lib\site-packages\pandas\io\excel\_xlrd.py in load_workbook(self, filepath_or_buffer)
     35             return open_workbook(file_contents=data)
     36         else:
---> 37             return open_workbook(filepath_or_buffer)
     38 
     39     @property

c:\python\lib\site-packages\xlrd\__init__.py in open_workbook(filename, logfile, verbosity, use_mmap, file_contents, encoding_override, formatting_info, on_demand, ragged_rows)
    128         if 'xl/workbook.xml' in component_names:
    129             from . import xlsx
--> 130             bk = xlsx.open_workbook_2007_xml(
    131                 zf,
    132                 component_names,

c:\python\lib\site-packages\xlrd\xlsx.py in open_workbook_2007_xml(zf, component_names, logfile, verbosity, use_mmap, formatting_info, on_demand, ragged_rows)
    810     del zflo
    811     zflo = zf.open(component_names['xl/workbook.xml'])
--> 812     x12book.process_stream(zflo, 'Workbook')
    813     del zflo
    814     props_name = 'docprops/core.xml'

c:\python\lib\site-packages\xlrd\xlsx.py in process_stream(self, stream, heading)
    264         self.tree = ET.parse(stream)
    265         getmethod = self.tag2meth.get
--> 266         for elem in self.tree.iter() if Element_has_iter else self.tree.getiterator():
    267             if self.verbosity >= 3:
    268                 self.dump_elem(elem)

AttributeError: 'ElementTree' object has no attribute 'getiterator'
EN

回答 9

Stack Overflow用户

发布于 2020-10-12 12:50:48

您可以尝试使用参数engine="openpyxl"。它帮助我解决了同样的问题。

票数 33
EN

Stack Overflow用户

发布于 2020-12-04 13:10:35

在python3.9+中使用pandas时会出现该错误,因为代码xml.etree.ElementTree.Element.getiterator()已被删除,该代码之前已被弃用并显示警告。

解决方法是安装另一个引擎openpyxl来读取excel文件,并替换读取excel文件的代码。

第一,

代码语言:javascript
运行
复制
pip3 install openpyxl

然后,编写pd.read_excel('student-results.xlsx', engine='openpyxl')而不是pd.read_excel('student-results.xlsx')

参考:Python bug tracker

票数 19
EN

Stack Overflow用户

发布于 2020-12-04 01:46:03

我在不带pandas的xlrd (1.2.0)或xlrd3 (1.0.0)上得到了同样的错误,但在Python3.9上得到了同样的错误。以下内容可能会引起那些寻求解释的人的兴趣:

只有在defusedxml可用时才会发生这种情况(在这种情况下,xlrd将使用它)。但它可以在不更改任何涉及的库的情况下解决:

代码语言:javascript
运行
复制
import xlrd
xlrd.xlsx.ensure_elementtree_imported(False, None)
xlrd.xlsx.Element_has_iter = True

第二行确保Element_has_iter在打开工作簿时不会被重置,因此它保持为True -如第三行中设置的那样。完成后,xlrd将使用iter,而不是在缺少的getiterator上崩溃。

也就是说,我同意使用openpyxl代替xlrd是一个更干净的解决方案,至少在xlrd或xlrd3可能得到修复之前是这样。Openpyxl似乎开发得更积极。在我的例子中,我必须调整对这些库的直接调用,这可能比仅仅输入openpyxl而不是xlrd来告诉pandas它应该做什么更多的工作,但我会考虑这样做。

因此,可以使用@corridda,使用openpyxl,其他人关于原因的看法是正确的,但这可能解释了更多关于原因的信息。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64264563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档