Zig*_*ggy 23 python excel pandas
这是我的代码。我刚刚安装了 jupyterlab,并在其中添加了 excel 文件。如果我更改文件在我的系统上的路径,也会出现同样的错误。我似乎找不到任何人在简单地将 excel 文件作为数据框导入时遇到同样的问题。
excel 文件是一个 3x26 表,其中包含 studentnr、course、result 列,其值分别为 101-105、AD、1.0-9.9。也许问题出在excel文件上?
无论哪种方式,我都不知道如何解决这个问题。
import pandas as pd
import numpy as np
df = pd.read_excel('student-results.xlsx')
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
---------------------------------------------------------------------------
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'
Run Code Online (Sandbox Code Playgroud)
Joe*_*hew 18
在python3.9+中使用pandas时会发生错误,因为xml.etree.ElementTree.Element.getiterator()之前已被弃用并带有警告的代码现在已被删除。
解决方法是安装另一个引擎 openpyxl 来读取 excel 文件,并替换读取 excel 文件的代码。
第一的,
pip3 install openpyxl
Run Code Online (Sandbox Code Playgroud)
然后,而不是pd.read_excel('student-results.xlsx'),写pd.read_excel('student-results.xlsx', engine='openpyxl')
参考: Python 错误跟踪器
Vin*_*ael 15
阅读完评论后,我可以确认下面的这个效果非常好。
确保您拥有 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
Run Code Online (Sandbox Code Playgroud)
在 Python 3.9 中工作
Phi*_*hiM 13
我在没有熊猫的情况下使用 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
Run Code Online (Sandbox Code Playgroud)
第二行确保Element_has_iter在打开工作簿时不会重置,以便它保持为 True - 如第三行中设置的那样。完成后,xlrd 使用iter而不是在丢失的getiterator.
也就是说,我同意使用 openpyxl 代替 xlrd 是一个更干净的解决方案,至少在 xlrd 或 xlrd3 可能得到修复之前。Openpyxl 似乎得到了更积极的开发。就我而言,我必须调整对这些库的直接调用,这可能比键入 openpyxl 而不是 xlrd 来告诉 pandas 它应该做什么更重要,但我会考虑它。
好吧,@corridda,使用 openpyxl,其他人对原因的看法是正确的,但也许这可以更多地解释原因。
| 归档时间: |
|
| 查看次数: |
15088 次 |
| 最近记录: |