[Python] Pandas에서 xlsx 파일 열기

조재훈·2020년 12월 25일
3
post-thumbnail

썸네일은 딴게 아니고 사실 이 포스트가 내 삽질로 인해 파생된 결과물이기 때문이다.
딱히 끝까지 읽지 않으셔도 상관은 없다.

파이썬으로는 내가 생각했던것 보다 정말 다양한 짓들을 할 수 있었다.
그 중 하나가 아예 엑셀 파일을 불러와서 판다스로 분석을 하는 것이었다.

수업때 강사님이 csv 확장자로 된 파일을 판다스로 불러올 수 있는걸 설명해주셨다.

쨘!

나는 괜히 또 삐딱하게 알려준 csv 말고 다른 확장자로 된 엑셀 파일을 열어보려고 시도했다. 뭐 딱히 삐딱하다기보단 그냥 당연히 될거라고 생각했다.

동일한 내용의 xlsx 파일을 같은 방식으로 시도했다. 이거는 read_csv가 아닌 read_excel 파일을 사용하라고 나와있었다. 그렇게 코드를 입력하고 실행을 했는데....


마지막 줄에 에러 문구가 떠있는데 처음보는 내용이었다.

XLRDError: Excel xlsx file; not supported

왜????

강사님께선 말씀하셨지, 코딩을 배우기 위해 필요한게 있다면 스택오버플로우 하나만 있어도 된다고....
아니나다를까, 똑같은 고민을 하는 사람들이 이미 질문을 올려두었다.
그리고 가장 추천이 높았던 답변 내용을 캡쳐해왔다.

https://stackoverflow.com/questions/65250207/pandas-cannot-open-an-excel-xlsx-file

일단 답변 내용은 잠재적인 안정성 이슈때문에 해당 기능은 지원을 중단했으며, 사용하고 싶으면 openpyxl 라이브러리를 쓰라는 것이다. 저기서 파란 밑줄로 링크걸린 이메일 주소는 아래와 같다.

https://groups.google.com/g/python-excel/c/IRa8IWq_4zk/m/Af8-hrRnAgAJ

정식으로 해당 기능 중단에 대한 안내를 한 메일이다. xlrd에서 xlsx 확장자를 읽는 기능이 파이썬 3.9 버전 이상부터는 불안정해서 지원을 끊는다고 한다.

xlrd는 또 무엇인가....

열심히 찾아보니 엑셀 파일을 읽어들일수 있게 한 라이브러리인데 pandas 같은데에 같이 파입이 되어서 굳이 따로 import할 필요없이 바로 쓸 수 있었던 모양이다.

read_excel() 기능에 대해서 공식 문서를 찾아보면 저 괄호안에 들어가는 인자들 중 engine 이라는게 있다.
(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html?highlight=read_excel#pandas.read_excel)

engine : str, default None
If io is not a buffer or path, this must be set to identify io. Supported engines: “xlrd”, “openpyxl”, “odf”, “pyxlsb”, default “xlrd”. Engine compatibility : - “xlrd” supports most old/new Excel file formats. - “openpyxl” supports newer Excel file formats. - “odf” supports OpenDocument file formats (.odf, .ods, .odt). - “pyxlsb” supports Binary Excel files.

기본적으로 제공하는 엔진은 xlrd인데 이 엔진이 지원이 중단되서 못쓰니 다른 엔진으로 교체를 해야 한다.

1) 간단한 방법

스택오버플로우에 달린 답변대로 하면 아래와 같이 하면 끝난다.

2) 조금 번거로운 방법

근데 나는 조금 삐딱한 사람이라 스택오버플로우에 달린 답변을 끝까지 읽지 않은 덕분에 다른 방법을 찾아 삽질을 했다.
그러다가 조금 번거로운 방법을 발견했는데 해당 내용도 같이 메모한다.
(https://www.soudegesu.com/en/post/python/pandas-with-openpyxl/)

중간에 columns를 따로 뺀 이유는 저렇게 안하면 헤더가 전부 깨져서 나온다.
그걸 방지하기 위해 미리 따로 읽어서 빼놓는 작업을 해놓는 것이다.

원래는 2번을 메모하려고 블로그를 작성하다가 스택오버플로우를 찬찬히 다시 읽어보면서 1번 방법을 찾아냈다.
이게 바로 블로그의 순기능인가 ㅋㅋㅋ
굳이 번거롭게 길게 쓰지 말고 엔진 하나 잘 교체해서 빨리빨리 끝내는게 나을 것 같다.

결론 : 사람이 답변을 해주면 끝까지 읽어보쟈

(썸네일 재투척. 수미상관의 구조를 따르기로 하였따)

profile
맨땅에 헤딩. 인생은 실전.

0개의 댓글