초딩도 할 수 있는 파이썬 자동화

[초딩도 할 수 있는 파이썬] 파이썬으로 엑셀 문서를 읽고 저장하기

나도한다코딩 2022. 10. 2. 23:30

엑셀 문서를 다룰 때 쓰는 파이썬 모듈 - pandas, openpyxl, xlwings, win32com

파이썬으로 엑셀 문서를 다룰 수 있는 모듈은 꽤 여러가지가 있다.
필자가 아는 것만해도 pandas + openpyxl, xlwings, win32com 등 이미 여러개이다.

xlwings는 엑셀 프로그램에서 vba와 직접 연동할 때 유용하고, win32com은 엑셀 프로그램을 직접 열어서 제어할 때 유용하다. 보통 win32com을 활용해서 엑셀 문서를 읽고 쓸 일이 별로 없는데, 간혹 보안이 걸려있거나 암호화되어있어 다른 접근으로 문서 내용 확인이 안 될때 문서를 직접 열어서 데이터를 가져오는 방식으로 활용할 수 있다.

이 글에서는 가장 범용적으로 쉽게 활용할 수 있는 pandas를 활용해 엑셀 문서를 불러오고 저장하는 것에 대해 소개하고자 한다.

공공데이터 포털에서 샘플로 "공무원연금공단_시군구별 성별 연금수급자 인원수" 파일을 하나 다운받아 활용해보자.

 

공무원연금공단_시군구별 성별 연금수급자 인원수_20211231

지역별 성별 연금수급자 인원수를 나타낸 자료입니다. 2021년 말 연금수급자를 대상으로 하였으며 우편번호 3자리를 통해 시군구를 구분하였습니다.

www.data.go.kr

공무원연금공단_시군구별 연금수급자 인원수

 

엑셀 문서를 읽을 때 쓰는 함수 - pandas.read_excel()

엑셀 파일을 읽어올 때는 pandas의 read_excel 을 활용하면 된다.

만약 엑셀 파일에 여러 시트가 있고 특정 시트만 불러오고 싶다면 sheet_name 옵션을 활용할 수 있다.

이 파일의 경우 Data 시트가 1개뿐이어서 결과가 똑같다. 관련하여 좀 더 복잡한 옵션들은 다음 블로그를 참조.

 

[Python pandas] read_excel() 옵션 정리

Python pandas로 excel 파일을 읽어오는 방법에 대한 전체적인 내용은 아래의 포스팅 참고https://velog.io/@inhwa1025/Python-pandas%EB%A1%9C-exel-%ED%8C%8C%EC%9D%BC-%EC%9D%BD%EA%B

velog.io

 

엑셀 문서를 쓰고 싶을 때 쓰는 함수 - df.to_excel()

이제 반대로 pandas의 DataFrame 구조의 파일을 excel 파일로 저장해보자. 이 때는 to_excel 함수를 사용한다.

테스트.xlsx 파일이 생성되었음을 알 수 있다.

to_excel 함수를 실행시 openpyxl 모듈이 없다고 오류가 날 수 있다. 없으면 설치해주자. 이 경우에도 해당 DataFrame 데이터를 특정 이름의 시트에 저장하고 싶다면 shee_name에 시트명을 지정해주면 된다.

 

엑셀 문서 하나에 여러 시트를 쓰고 싶을 때 쓰는 함수 - pandas.ExcelWriter()

마지막으로 2개 이상의 DataFrame 데이터를 하나의 엑셀 파일에 시트별로 저장하고 싶을 수 있다. 그럼 같은 파일에 to_excel 함수를 두 번 쓰면 안되나? 싶지만 그럼 다음과 같은 결과가 나온다.

import pandas as pd
df = pd.read_excel('공무원연금공단_시군구별 성별 연금수급자 인원수_20211231.xlsx', sheet_name='Data')
df1 = df
df2 = df
df1.to_excel('테스트.xlsx', sheet_name='시트1')
df2.to_excel('테스트.xlsx', sheet_name='시트2')

시트1을 사라지고 시트2만 남았다.

to_excel 함수를 실행할 때마다 새로 파일을 만들기 때문에 df1.to_excel로 쓴 결과가 사라지고 없음을 알 수 있다. 이런 경우엔 다음과같이 pd.ExcelWriter()로 객체를 지정한 이후 파일을 쓰고 종료를 해야 파일 하나에 여러 시트를 쓰는 것이 가능하다.

import pandas as pd
df = pd.read_excel('공무원연금공단_시군구별 성별 연금수급자 인원수_20211231.xlsx', sheet_name='Data')
df1 = df
df2 = df
with pd.ExcelWriter('테스트.xlsx') as writer:
    df1.to_excel(writer, sheet_name='시트1')
    df2.to_excel(writer, sheet_name='시트2')

시트1과 시트2가 모두 잘 저장되었음을 확인할 수 있다.