에러 발생
pandas.read_excel를 사용하는 도중 다음과 같은 에러를 만났다.
Traceback (most recent call last):
File "/home/____________________.py", line 189, in read_data
df = pd.read_excel(self.data_path, header=0)
File "/home/anaconda3/lib/python3.9/site-packages/pandas/io/excel/_base.py", line 478, in read_excel
io = ExcelFile(io, storage_options=storage_options, engine=engine)
File "/home/anaconda3/lib/python3.9/site-packages/pandas/io/excel/_base.py", line 1513, in __init__
self._reader = self._engines[engine](self._io, storage_options=storage_options)
File "/home/anaconda3/lib/python3.9/site-packages/pandas/io/excel/_openpyxl.py", line 549, in __init__
super().__init__(filepath_or_buffer, storage_options=storage_options)
File "/home/anaconda3/lib/python3.9/site-packages/pandas/io/excel/_base.py", line 540, in __init__
self.book = self.load_workbook(self.handles.handle)
File "/home/anaconda3/lib/python3.9/site-packages/pandas/io/excel/_openpyxl.py", line 560, in load_workbook
return load_workbook(
File "/home/anaconda3/lib/python3.9/site-packages/openpyxl/reader/excel.py", line 346, in load_workbook
reader.read()
File "/home/anaconda3/lib/python3.9/site-packages/openpyxl/reader/excel.py", line 299, in read
apply_stylesheet(self.archive, self.wb)
File "/home/anaconda3/lib/python3.9/site-packages/openpyxl/styles/stylesheet.py", line 198, in apply_stylesheet
stylesheet = Stylesheet.from_tree(node)
File "/home/anaconda3/lib/python3.9/site-packages/openpyxl/styles/stylesheet.py", line 103, in from_tree
return super(Stylesheet, cls).from_tree(node)
File "/home/anaconda3/lib/python3.9/site-packages/openpyxl/descriptors/serialisable.py", line 87, in from_tree
obj = desc.expected_type.from_tree(el)
File "/home/anaconda3/lib/python3.9/site-packages/openpyxl/descriptors/serialisable.py", line 87, in from_tree
obj = desc.expected_type.from_tree(el)
File "/home/anaconda3/lib/python3.9/site-packages/openpyxl/descriptors/serialisable.py", line 103, in from_tree
return cls(**attrib)
TypeError: __init__() got an unexpected keyword argument 'count'
난생 처음 보는 에러인데다, 자주 쓰던 pandas.read_excel에서 왜 이런 에러가 생기는지 도무지 모르겠어서 많은 검색과 구글링을 통해 문제를 해결(근본적인 해결책은 아닐지도...)할 수 있었다. 나와 같은 혹은 비슷한 에러를 만날 누군가를 위해 해결 방법을 포스팅해본다.
문제
나의 경우 __init__ 메소드에 알 수 없는 인자가 들어왔다고 에러가 떴는데, 클래스를 상속할 때 다른 클래스와 연동 과정에서 'count'라는 인자가 들어온 것 같다. 중요한건 수많은 __init__ 중에 어떤 __init__인지를 찾는 지가 문제였다.
해당 에러는 ubuntu 서버에서 실행했을 때 얻은 에러라 같은 환경을 로컬에 아나콘다로 구현하고 실행해보니 비슷한 듯 다른 듯한 에러를 만날 수 있었다.
File "e:\____\test\rexcel.py", line 3, in <module>
df = pd.read_excel("C:/Users/__________.xlsx", header=0)
File "E:\Python\lib\site-packages\pandas\util\_decorators.py", line 311, in wrapper
return func(*args, **kwargs)
File "E:\Python\lib\site-packages\pandas\io\excel\_base.py", line 364, in read_excel
io = ExcelFile(io, storage_options=storage_options, engine=engine)
File "E:\Python\lib\site-packages\pandas\io\excel\_base.py", line 1233, in __init__
self._reader = self._engines[engine](self._io, storage_options=storage_options)
File "E:\Python\lib\site-packages\pandas\io\excel\_openpyxl.py", line 522, in __init__
super().__init__(filepath_or_buffer, storage_options=storage_options)
File "E:\Python\lib\site-packages\pandas\io\excel\_base.py", line 420, in __init__
self.book = self.load_workbook(self.handles.handle)
File "E:\Python\lib\site-packages\pandas\io\excel\_openpyxl.py", line 533, in load_workbook return load_workbook(
File "E:\Python\lib\site-packages\openpyxl\reader\excel.py", line 346, in load_workbook
reader.read()
apply_stylesheet(self.archive, self.wb)
File "E:\Python\lib\site-packages\openpyxl\styles\stylesheet.py", line 198, in apply_stylesheet
stylesheet = Stylesheet.from_tree(node)
File "E:\Python\lib\site-packages\openpyxl\styles\stylesheet.py", line 103, in from_tree
return super(Stylesheet, cls).from_tree(node)
File "E:\Python\lib\site-packages\openpyxl\descriptors\serialisable.py", line 87, in from_tree
obj = desc.expected_type.from_tree(el)
File "E:\Python\lib\site-packages\openpyxl\descriptors\serialisable.py", line 87, in from_tree
obj = desc.expected_type.from_tree(el)
File "E:\Python\lib\site-packages\openpyxl\descriptors\serialisable.py", line 103, in from_tree
return cls(**attrib)
TypeError: CellStyle.__init__() got an unexpected keyword argument 'count'
주목해야할 부분은 마지막에 __init__이 CellStyle 내의 것이라는 것이다. 이 CellStyle은 "E:/Python/lib/site-packages/openpyxl/styles/cell_style.py" 파일에 있는 것인데, ubuntu 서버로 보자면 "/home/anaconda3/lib/python3.9/site-packages/openpyxl/styles/cell_style.py" 파일이다.
해당 파일의 CellStyle class를 찾아보면 Serialisable을 상속하여 정의되는데, 이 때 __init__ 함수에서 count라는 인자를 찾지 못하여 난 에러인 것이었다.
해결방법
이 count라는 게 어디서 튀어나오는지는 도무지 의문이지만, 일단 간단하고도 쿨한 해결 방법이 있다.
class CellStyle(Serialisable):
...
def __init__(self,
...,
count=None,
):
...
...
바로 위와 같이 __init__ 함수의 인자로 count=None을 추가해주는 것이다.
count라는 게 어디서 오는지도 모르고 어디에서 사용되는지도 모르지만 이 한 줄만 추가해주면 에러가 해결된다. 너무 야매 해결방법이긴 하지만 이걸로 에러를 만나지 않고 정상적으로 실행될 수 있으니 다행이지 않나... 라고 생각한다.
나와 비슷한 에러를 만났다면, 오류 Traceback을 타고 올라가며 참조된 파일들을 하나하나 살피는 걸 추천한다. serialisable을 상속하는 클래스들을 샅샅이 뒤져보는 것도 하나의 방법일 것 같다.
혹시라도 해당 에러에 대한 조언이 있다면 댓글 부탁드립니다.
'Python' 카테고리의 다른 글
[python] multiprocessing 사용법 (0) | 2023.08.14 |
---|---|
[python] 동적 변수명 - globals(), locals() (0) | 2023.08.11 |
[python] datetime resample, groupby with Grouper (0) | 2023.08.07 |
[python] pandas.DataFrame.round 반올림 (0) | 2023.08.06 |
[python] SQL select query by date (0) | 2023.08.05 |