특성 오류: 'ElementExcel 파일을 가져오려고 할 때 Tree' 개체에 'getiterator' 특성이 없습니다.
이건 내 코드야.방금 주피터랩을 설치했고 거기에 엑셀 파일을 추가했습니다.시스템에서 파일이 있는 위치로 경로를 변경하는 경우에도 동일한 오류가 발생합니다.엑셀 파일을 데이터 프레임으로 가져오는 것만으로는 동일한 문제를 가진 사람을 찾을 수 없는 것 같습니다.
Excel 파일은 각각 101-105, A-D, 1.0-9.9와 같은 값을 가진 학생 nr, 과정, 결과 열이 있는 3x26 테이블입니다.혹시 엑셀 파일에 문제가 있는 것은 아닐까요?
어느 쪽이든 저는 이것을 어떻게 고칠지 모릅니다.
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'
은 인수 은논쟁사수있다니습용할당을신을 해 볼 수 있습니다.engine="openpyxl"
그것은 제가 같은 문제를 해결하는 데 도움이 되었습니다.
팬더가 없는 xlrd(1.2.0)나 xlrd3(1.0.0)에서도 동일한 오류가 발생했지만 Python 3.9에서는 동일한 오류가 발생했습니다.다음은 설명을 찾는 사람들의 흥미를 끌 수 있습니다.
이는 디퓨즈된 xml을 사용할 수 있을 때만 발생합니다(이 경우 xlrd가 이를 사용합니다)그러나 관련 라이브러리를 변경하지 않고도 해결할 수 있습니다.
import xlrd
xlrd.xlsx.ensure_elementtree_imported(False, None)
xlrd.xlsx.Element_has_iter = True
두 번째 줄은 다음을 보장합니다.Element_has_iter
워크북을 열 때 재설정되지 않으므로 세 번째 줄에 설정된 대로 True로 유지됩니다.완료되면 는 xlrd를 사용합니다.iter
실종자들과 충돌하는 대신에getiterator
.
그렇긴 하지만, 저는 적어도 xlrd 또는 xlrd3가 해결될 때까지 xlrd 대신 openpyxl로 이동하는 것이 더 깨끗한 해결책이라는 것에 동의합니다.Openpyxl은 더 활발하게 개발된 것으로 보입니다.저의 경우, 저는 도서관에 직접 전화를 걸어야 합니다. 판다에게 무엇을 해야 하는지 알려주는 것은 xlrd 대신 openpyxl을 입력하는 것보다 더 많은 작업일 수 있지만 고려해 보겠습니다.
@corridda와 마찬가지로 openpyxl을 사용하고 다른 것들이 원인에 대해 옳지만, 아마도 이것이 원인에 대해 조금 더 설명해줄 것입니다.
가 python3.9이기 합니다.+에서 panda를 사용할 때 코드 때문에 오류가 발생합니다.xml.etree.ElementTree.Element.getiterator()
이전에는 경고와 함께 사용되지 않았지만 이제는 제거되었습니다.
해결 방법은 다른 엔진 openpyxl을 설치하여 엑셀 파일을 읽고 엑셀 파일을 읽는 코드를 교체하는 것입니다.
첫번째,
pip3 install openpyxl
그면대신 에.pd.read_excel('student-results.xlsx')
글을 쓰다pd.read_excel('student-results.xlsx', engine='openpyxl')
참조:파이썬 버그 추적기
저는 댓글을 읽고 아래의 것이 완벽하게 작동했음을 확인할 수 있습니다.
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에서 작업했습니다.
여기에서 이슈 설명을 확인할 수 있습니다.Python 3.9를 실행하고 호출이 제거된 xlrd 라이브러리를 사용합니다.getiterator
방법.파일에서 "뒤로 추적"에서 코드의 일부를 찾아 교체해야 합니다.getiterator
와 함께iter
.
Python 파일을 실행하고 해당 호출을 몇 번 교체해야 할 수도 있습니다.
이것은 제가 Python 3.9로 업그레이드했을 때 나타났습니다.이 차이는 압축 형식의 조합과 관련이 있는 것으로 보입니다.xlsx
파일 및 반복기 기능의 사용을 중지합니다.
위해서xlsx
내가 지정하는 데 필요한 문서.engine='openpyxl'
열 때 키워드 인수입니다.
에 대해서는 그렇지 않습니다.csv
또는xls
문서.
openpyxl 설치
$ pip3 install openpyxl
을 엽니다.xlsx
그리고.xls
다른 엔진을 가진 파일.
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
다음 단계를 수행합니다.
- /Library/Frameworks/Python.frameworks/Versions/3.9/lib/python3.9/site-packages/xlrd로 이동합니다.
- 임의의 텍스트 편집기에서 xlsx.py 을 열고 두 getiterator() 메서드를 iter()로 바꿉니다.
- 주피터 노트북을 다시 로드합니다.그건 작동할 것이다.
스택스킬에서 코스를 진행하다가 이런 문제가 생겼습니다.둘러본 결과, 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/
import xlrd
path = "C:\\Users\\user\\file\\pyfiles\\msbook1.xlsx" # your filepath and name and extension
xlrd.xlsx.ensure_elementtree_imported(False, None)
xlrd.xlsx.Element_has_iter = True
book = xlrd.open_workbook(path)
sheet = book.sheet_by_index(0)
print(1222222222222, sheet.cell_value(2,2))
장난치는 것을 피하기 위해xlrd
또한 Excel 파일을 저장할 수 있습니다..xls
대신 내선.xlsx
.
언급URL : https://stackoverflow.com/questions/64264563/attributeerror-elementtree-object-has-no-attribute-getiterator-when-trying
'programing' 카테고리의 다른 글
C# 디렉터리에 있는 모든 파일을 재귀적으로 나열하는 방법은 무엇입니까? (0) | 2023.05.11 |
---|---|
IFormatProvider의 역할은 무엇입니까? (0) | 2023.05.11 |
woocommerce 이메일 알림의 get_post_module (0) | 2023.03.27 |
경고: 실패한 propType: 잘못된 prop 'component'가 'Route'에 제공됨 (0) | 2023.03.27 |
p:calendar를 사용하여 시작 날짜와 종료 날짜를 상호 제한(검증 없음) (0) | 2023.03.27 |