programing

특성 오류: 'ElementExcel 파일을 가져오려고 할 때 Tree' 개체에 'getiterator' 특성이 없습니다.

lastmemo 2023. 5. 11. 23:25
반응형

특성 오류: '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

다음 단계를 수행합니다.

  1. /Library/Frameworks/Python.frameworks/Versions/3.9/lib/python3.9/site-packages/xlrd로 이동합니다.
  2. 임의의 텍스트 편집기에서 xlsx.py 을 열고 두 getiterator() 메서드를 iter()로 바꿉니다.
  3. 주피터 노트북을 다시 로드합니다.그건 작동할 것이다.

스택스킬에서 코스를 진행하다가 이런 문제가 생겼습니다.둘러본 결과, 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

반응형