【Python3.9使用pandas读取Excel报错】AttributeError: ‘ElementTree‘ object has no attribute ‘getiterator‘

1. Python版本和运行环境

  • Python3.9.0
  • jupyter notebook

2. 代码

import pandas as pd
#需要读取的Excel的路径,最好是简单的英文路径
#路径前面的r是防止字符转义
file_path = r"E:/project/data.xlsx"
sheet1 = pd.read_excel(io=file_path)
#默认显示Excel的前5行
sheet1.head()

代码就是简单的读取Excel的内容,代码完全没问题,如果使用的是以前版本的Python,那么应该正常读取显示Excel前5行的内容。

3. Python3.9.0报错
针对上述的代码,Python3.9.0会出现如下报错:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-6-9d38e4d56bbe> in <module>
      1 import pandas as pd
      2 file_path = r"E:/project/data.xlsx"
----> 3 sheet1 = pd.read_excel(io=file_path)
      4 sheet1.head()

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'

4. 原因和解决方法

  • 原因
    报错信息最后一句:
AttributeError: 'ElementTree' object has no attribute 'getiterator'

大概意思就是:ElementTree对象没有叫做getiterator的方法。
定位到报错的xlsx.py文件,此文件在我们的xlrd库中,xlrd库是一个很常用的读取excel文件的库。
理论上来说使用pip install xlrd下载的库应该是和我们的Python版本对应的库才对,不应该出现库里面的方法找不打才对。
于是我查到了官方文档

xml.etree.ElementTree.Element.getiterator() has been deprecated since Python 2.7, and has been removed in Python 3.9. Replace all instances of Element.getiterator(tag) with Element.iter(tag) in ase/io/exciting.py. This MR also removes extraneous whitespace on otherwise empty lines in that file

大概意思是:xml.etree.ElementTree.Element.getiterator()自Python 2.7起已弃用,并已在Python 3.9中删除。应该替换所有实例Element.getiterator(tag)为Element.iter(tag)。
到这基本上可以破案了:不是代码的问题;不是Excel文件的问题;不是路径的问题(排除问题太自闭了)。然而我不知道既然废除了Element.getiterator()方法,为啥我更新的xlrd库不做相应的更新(咱也不敢问)。

  • 解决办法
    定位自己的xlrd\xlsx.py所在位置:win+R——>cmd——>pip show xlrd
    打开如下路径
    打开xlsx.py文件,查找替换(建议先备份xlsx.py)所有的getiterator()方法为iter(),保存即可。
  • 解决
    在这里插入图片描述
<think>好的,我现在要解决用户遇到的PythonElementTree对象没有getiterator属性的错误。根据用户提供的引用内容,我需要整理出可行的解决方案。首先,用户提到xlrd库版本过高的问题,需要降级到1.2.0版本,但之后仍然出现错误,因为Python 3.9移除了getiterator方法。引用中建议替换xlsx.py文件中的getiterator为iter,这可能是解决方法之一。另外,引用4提到使用pandas时指定engine为openpyxl。我需要将这些信息整合起来,形成清晰的解决步骤。 首先,用户可能是在使用xlrd库读取Excel文件时遇到这个问题。xlrd在2.0.0版本之后不再支持xlsx文件,所以可能需要使用openpyxl来处理xlsx格式。另外,如果用户已经安装了高版本的xlrd,降级到1.2.0可能有效,但需要同时处理Python 3.9不兼容的问题,即替换getiterator为iter。此外,使用pandas时指定引擎也是一个解决方案。需要分情况讨论,比如用户是否在使用xlrd直接读取xlsx,或者通过pandas间接使用xlrd。 需要验证每个步骤的正确性,比如降级xlrd是否确实需要,替换代码是否可行。还要注意用户可能的环境差异,比如不同Python版本。同时,可能还有其他替代方案,比如使用其他库如openpyxl代替xlrd。需要将这些方法整理成步骤,并给出具体的操作示例,如安装命令、代码修改示例等。最后,确保用户能够按照步骤解决问题,并理解背后的原因,避免未来再次出现类似问题。</think>### Python ElementTree getiterator报错解决方案 当遇到`AttributeError:ElementTreeobject has no attributegetiterator’`错误时,通常由Python版本升级导致旧代码兼容性问题。以下是具体解决步骤: --- #### 1. **确认错误原因** 此错误因Python 3.9+移除了`ElementTree.getiterator()`方法,而旧版第三方库(如`xlrd 1.2.0`)仍依赖此方法[^1][^2][^3]。 --- #### 2. **分场景解决方案** **场景一:使用xlrd库读取Excel文件** - **步骤1:降低xlrd版本** ```bash pip uninstall xlrd pip install xlrd==1.2.0 ``` 但仅降级仍会报错,需修改库源码[^2]。 - **步骤2:修改xlrd源码** 1. 找到`xlrd`安装路径下的`xlsx.py`文件(如`D:\python\Lib\site-packages\xlrd\xlsx.py`) 2. 全局替换所有`getiterator()`为`iter()`(共两处)[^3] 3. 保存文件并重启Python环境 **场景二:使用pandas读取Excel文件** - **直接指定引擎为openpyxl** ```python import pandas as pd df = pd.read_excel("文件.xlsx", engine="openpyxl") ``` 无需修改库源码,推荐优先使用此方法[^4] --- #### 3. **替代方案建议** | 方案 | 适用场景 | 优点 | |------|----------|------| | 修改xlrd源码 | 必须使用旧版xlrd | 兼容原有代码 | | 使用openpyxl引擎 | 处理.xlsx文件 | 官方推荐方式 | | 升级到xlrd>=2.0 | 读取.xls文件 | 新版本默认支持 | --- #### 4. **验证解决方案** 修改后运行测试代码: ```python # 验证xlrd方案 import xlrd wb = xlrd.open_workbook("test.xlsx") # 验证pandas方案 import pandas as pd pd.read_excel("test.xlsx", engine="openpyxl") ``` --- #### 5. **预防措施** - 对于.xlsx文件优先使用`openpyxl`库 - 定期更新依赖库版本 - 使用虚拟环境管理项目依赖 ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值