Python 에러 해결 방법 Workbook corruption: seen[2] == 4
xlrd라이브러리나 pandas라이브러리를 써서 엑셀(xls) 파을 열려고 하니 xlrd.compdoc.CompDocError: Workbook corruption: seen[2] == 4 에러가 떴습니다. 직접 엑셀로 열면 잘 열리는데 Python 코드로 열면 안 되는군요. openpyxl 라이브러리도 써보고 xlsx로도 바꿔보고 여러 가지 시도를 해봤지만 제 경우는 전혀 동작하지 않았습니다.
내 시간을 많이 잡아먹은 에러 xlrd.compdoc.CompDocError: Workbook corruption: seen[2] == 4
Exception has occurred: CompDocError
Workbook corruption: seen[2] == 4
File "/Users/iteastory/dev/ChatGPT/c1.py", line 71, in <module>
df = pd.read_excel(downloaded_file, engine='xlrd')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
xlrd.compdoc.CompDocError: Workbook corruption: seen[2] == 4
결국 해결책을 찾았습니다. 이 문제를 해결하기 위해 두 가지 방법이 있습니다.
1. Excel을 열어서 직접 저장을 한 뒤 열기
엑셀 프로그램에서 직접 열면 열려서 저장한 뒤 python 코드로 읽어오면 제대로 읽을 수 있습니다. 그런데 자동화를 하기 위해 Python으로 코드를 만들고 있는 거라 이 방법은 좀 문제가 있었습니다. 엑셀 파일을 이거 하나만 사용할 거면 상관없지만 매번 다운로드한 파일을 가지고 작업을 해야 하는 관계로 이 방법은 사용할 수 없었습니다.
2. win32com.client 라이브러리를 사용
직접 엑셀을 사용해서 파일을 저장하면 정상 동작하니 Python에서 직접 엑셀을 불러와서 저장하도록 만들면 되겠지요. win32com.client 라이브러리를 사용하면 직접 하지 않아도 엑셀을 제어하고 파일을 저장할 수 있습니다. 다만 이건 엑셀이 설치되어 있어야 하고 윈도우에서만 동작하는 방식이라 맥에서도 사용하려면 다른 방법을 찾아야 했습니다.
혹시 몰라 필요하신 분을 위해 코드를 남겨둡니다.
win32com.client 라이브러리 사용하는 코드 예제
import os
import win32com.client
def open_and_save_excel(filename):
# Excel 애플리케이션 시작
excel = win32com.client.Dispatch("Excel.Application")
# 파일 열기
workbook = excel.Workbooks.Open(filename)
# 파일 저장
workbook.Save()
# Excel 종료
excel.Quit()
# xls 파일 경로
filename = os.path.abspath('파일경로.xls')
# 함수 실행
open_and_save_excel(filename)
이렇게 파일을 저장한 뒤 사용하면 잘 동작합니다.
3. xlrd 라이브러리를 직접 수정
xlrd라이브러리를 수정해서 해결하는 방법이 있습니다. 에러 메시지를 보면 xlrd의 compdoc.py의 429번째 줄에서 문제가 발생했습니다. 여기를 수정해줘야 하는데요. 직접 xlrd가 설치되어 있는 위치로 가서 compdoc.py를 수정해 줍니다.
에러 메시지 안에 경로도 나와있으니 해당 경로로 가서 수정해 주면 됩니다.
저는 Users/iteastory/dev/ChatGPT/.venv/lib/python3.11/site-packages/xlrd/compdoc.py입니다. 이 파일의 429로 가보면 아래와 같은 코드를 볼 수 있습니다. 이 부분을 수정해 줍니다.
if self.seen[s]: 가 있는 426번 줄부터 429번 줄까지 주석처리를 해주시면 됩니다.
이렇게 수정하고 난 뒤 저장한 후 다시 코드를 실행하면 우리를 괴롭히던 xlrd.compdoc.CompDocError: Workbook corruption: seen[2] == 4 문제가 해결된 것을 확인할 수 있습니다.