AttributeError: 'ElementTree' 对象在尝试导入 excel 文件时没有属性 'getiterator'

Posted

技术标签:

【中文标题】AttributeError: \'ElementTree\' 对象在尝试导入 excel 文件时没有属性 \'getiterator\'【英文标题】:AttributeError: 'ElementTree' object has no attribute 'getiterator' when trying to import excel fileAttributeError: 'ElementTree' 对象在尝试导入 excel 文件时没有属性 'getiterator' 【发布时间】:2021-01-23 14:54:39 【问题描述】:

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

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

无论如何我都不知道如何解决这个问题。

import pandas as pd
import numpy as np
df = pd.read_excel('student-results.xlsx')

这是我得到的错误:

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

【问题讨论】:

超级烦人的bug,希望尽快修复。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

首先,

pip3 install openpyxl

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

参考: Python bug tracker

【讨论】:

这里有更多关于他们对 pandas 所做的修复的详细信息:github.com/pandas-dev/pandas/issues/37795【参考方案3】:

我在没有 pandas 的情况下使用 xlrd (1.2.0) 或 xlrd3 (1.0.0) 时遇到了同样的错误,但使用 Python 3.9。寻找解释的人可能会对以下内容感兴趣:

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

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,其他人对原因的看法是正确的,但也许这可以解释更多原因。

【讨论】:

这是真正的解决方案。我刚刚检查了xlrd 是否存在未解决的问题,我发现他们放弃了对 xlsx 文件的支持,因此不会修复。 完美解决方案。谢谢【参考方案4】:

您可以查看问题描述here。 您运行 Python 3.9 并使用 xlrd 库调用删除的getiterator 方法。您应该在 "Trace back" 的文件中找到部分代码,并将 getiterator 替换为 iter

可能需要运行 Python 文件并多次替换该调用。

【讨论】:

【参考方案5】:

当我升级到 Python 3.9 时,这出现了。差异似乎与xlsx 文件的压缩格式的组合以及迭代器函数的弃用有关。

对于xlsx 文档,我需要在打开时指定engine='openpyxl' 关键字参数。

csvxls 文档不是这种情况。

安装 openpyxl

$ pip3 install openpyxl

用不同的引擎打开xlsxxls文件。

from pathlib import Path
import pandas as pd

file_path = Path(file_name)

if file_path.suffix == '.xlsx':
    df = pd.read_excel(file_name, engine='openpyxl')

elif file_path.suffix == '.xls':
    df = pd.read_excel(file_name)

else:
    # handle other file types
    pass

【讨论】:

【参考方案6】:

阅读完 cmets 后,我可以确认下面的这个完美运行。 确保您拥有 XLRD 版本 1.2.0 新版本的 xlrd 没有 xlsx 选项。

pip install xrld==1.2.0 

import xlrd
xlrd.xlsx.ensure_elementtree_imported(False, None)
xlrd.xlsx.Element_has_iter = True

pd.read_excel(path) #don't even need the engine=openpyxl

在 Python 3.9 中工作

【讨论】:

【参考方案7】:

按照以下步骤操作:

    转到 /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/xlrd 在任何文本编辑器中打开 xlsx.py 并将两个 getiterator() 方法替换为 iter()。 重新加载您的 Jupiter 笔记本。它会起作用的。

【讨论】:

【参考方案8】:

我在学习 stackskill 的课程时遇到了这个问题。环顾四周后,我发现 xlsx.py 文件本身具有 getiterator() 并且从我读过的内容来看,它需要只是 iter()。

据我所知,xlsx.py 文件中只有两个部分需要更改。这似乎很容易解决。

如果您想修改它们,我将发布我已更改的代码行。

我遇到的代码的第一部分在第 266 行,然后在第 312 行。

每个的原始行应该是这样的。

for elem in self.tree.iter() if Element_has_iter else self.tree.getiterator(): 

修改后应该是这个样子。

for elem in self.tree.iter() if Element_has_iter else self.tree.iter():

确保在修改文件之前制作了一份文件副本,但到目前为止,它似乎比添加 engine="openpyxl" 效果更好,因为这似乎只适用于某些代码部分,而不是其他部分。

我希望这可以帮助大家寻找解决此问题的方法。我还提供了我找到修复程序的链接。

https://www.programmersought.com/article/61207614127/

【讨论】:

【参考方案9】:

为避免混淆xlrd,您还可以使用.xls 扩展名而不是.xlsx 保存您的Excel 文件。

【讨论】:

AFAIK,这是错误的:应该使用更新的 .xlsx,而 openpyxl 无法读取 .xls 文件。正如我从快速测试中记得的那样,无论如何,.xls 文件也会因 xlrd 而失败。

以上是关于AttributeError: 'ElementTree' 对象在尝试导入 excel 文件时没有属性 'getiterator'的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:“模块”对象没有属性“作者”

初学者 Python:AttributeError:'list' 对象没有属性

AttributeError:“字节”对象没有属性“告诉”

AttributeError: 'RDD' 对象没有属性 'show'

AttributeError:“NumpyArrayIterator”对象没有属性“类”

AttributeError:模块 'dbus' 没有属性 'lowlevel'