Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

311
Vistas
AttributeError: el objeto 'ElementTree' no tiene el atributo 'getiterator' al intentar importar un archivo de Excel

Este es mi código. Acabo de instalar jupyterlab y agregué el archivo de Excel allí. Mismo error si cambio la ruta a donde está el archivo en mi sistema. Parece que no puedo encontrar a nadie que haya tenido el mismo problema al importar un archivo de Excel como un marco de datos.

El archivo de Excel es una tabla de 3x26 con columnas de estudiante, curso y resultado que tienen valores como 101-105, AD, 1.0-9.9 respectivamente. ¿Quizás el problema radica en el archivo de Excel?

De cualquier manera, no tengo idea de cómo solucionar esto.

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

Este es el error que estoy recibiendo:

 --------------------------------------------------------------------------- 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'
over 4 years ago · Santiago Trujillo
9 Respuestas
Responde la pregunta

0

Siga los pasos a continuación:

  1. Vaya a /Librería/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/xlrd
  2. abra xlsx.py en cualquier editor de texto y reemplace los dos métodos getiterator() con iter().
  3. Recarga tu cuaderno Júpiter. Funcionará.
over 4 years ago · Santiago Trujillo Denunciar

0

Para evitar meterse con xlrd , también puede guardar su archivo de Excel con la extensión .xls en lugar de .xlsx .

over 4 years ago · Santiago Trujillo Denunciar

0

Recibí el mismo error con xlrd (1.2.0) o xlrd3 (1.0.0) sin pandas, pero con Python 3.9. Lo siguiente puede interesar a aquellos que buscan una explicación:

Solo sucedió cuando deusedxml estaba disponible (en ese caso, xlrd lo usará). Pero podría solucionarse, sin cambiar ninguna de las bibliotecas involucradas:

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

La segunda línea garantiza que Element_has_iter no se restablecerá al abrir un libro de trabajo, de modo que permanezca en True, como se establece en la tercera línea. Cuando se hace esto, xlrd usa iter en lugar de fallar en el getiterator faltante.

Dicho esto, estoy de acuerdo en que pasar a openpyxl en lugar de xlrd es una solución más limpia, al menos hasta que xlrd o xlrd3 posiblemente se arreglen. Openpyxl parece estar más activamente desarrollado. En mi caso, tengo que adaptar las llamadas directas a esas bibliotecas, probablemente sea más trabajo que simplemente escribir openpyxl en lugar de xlrd para decirle a los pandas lo que debería hacer, pero lo consideraré.

Entonces, está bien con @corridda, use openpyxl, y otros tienen razón sobre la causa, pero tal vez esto explique un poco más las causas.

over 4 years ago · Santiago Trujillo Denunciar

0

El error ocurre cuando pandas se usa en python3.9+ porque el código xml.etree.ElementTree.Element.getiterator() que había quedado obsoleto con una advertencia anteriormente, ahora se eliminó.

Una solución es instalar otro motor openpyxl para leer el archivo de Excel y reemplazar su código que lee el archivo de Excel.

Primero,

 pip3 install openpyxl

Luego, en lugar de pd.read_excel('student-results.xlsx') , escriba pd.read_excel('student-results.xlsx', engine='openpyxl')

Referencia: rastreador de errores de Python

over 4 years ago · Santiago Trujillo Denunciar

0

Podría intentar usar un engine="openpyxl" . Me ayudó a resolver el mismo problema.

over 4 years ago · Santiago Trujillo Denunciar

0

Puede consultar la descripción del problema aquí . Ejecuta Python 3.9 y usa la biblioteca xlrd que llama al método getiterator eliminado. Debería encontrar parte del código en el archivo de su "Traza atrás" y reemplazar getiterator con iter .

Es posible que deba ejecutar el archivo Python y reemplazar esas llamadas un par de veces.

over 4 years ago · Santiago Trujillo Denunciar

0

Esto me apareció cuando actualicé a Python 3.9. La diferencia parece estar relacionada con una combinación del formato de compresión de los archivos xlsx y la desaprobación de una función iteradora.

Para los documentos xlsx , necesito especificar el argumento de la palabra clave engine='openpyxl' al abrir.

Este no es el caso de los documentos csv o xls .

Instalar openpyxl

 $ pip3 install openpyxl

Abra archivos xlsx y xls con diferentes motores.

 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
over 4 years ago · Santiago Trujillo Denunciar

0

Después de leer los comentarios, puedo confirmar que este a continuación funcionó perfectamente.
Asegúrese de tener XLRD versión 1.2.0 La nueva versión de xlrd no tiene la opción 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

Trabajó en Python 3.9

over 4 years ago · Santiago Trujillo Denunciar

0

Tuve este problema mientras trabajaba en un curso de stackskill. Después de buscar, descubrí que el archivo xlsx.py en sí tiene getiterator() y, por lo que había leído, debe ser solo iter().

Solo hay dos secciones en el archivo xlsx.py que requieren cambios hasta donde yo había notado. Parecía ser una solución fácil.

Publicaré la línea de código que he cambiado si desea modificarlos.

La primera sección del código que encontré está en la línea 266 y nuevamente en la 312.

La línea original para cada uno debería ser así.

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

Con la modificación debería verse así.

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

Asegúrese de hacer una copia del archivo antes de modificarlo, pero a partir de ahora parece estar funcionando mejor que agregar engine="openpyxl", ya que esto parece funcionar solo parcialmente con ciertas secciones de código en lugar de otras.

Espero que esto ayude a todos a buscar una solución para esto. También he incluido un enlace de donde encontré la solución.

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

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda