안녕하세요
오늘은 파이썬으로 폴더 내 엑셀파일을 한번에 통합해보겠습니다.
최종 코드는 맨 아래에 넣어두었습니다 !
엑셀로도 가능하지만, 여러 가지 방법을 알려드리고자 파이썬으로 하는 걸 알려드리겠습니다.
코드 없이 쉽게 폴더 내 파일 병합하고 싶다하시는 분은 엑셀 파워쿼리를 쓰는 방법을 참고해주세요 ! (엄청 쉽습니다)
2022.05.09 - [엑셀(Excel)] - [파워쿼리 5강] 엑셀 파일 병합_자동화 기본편
[파워쿼리 5강] 엑셀 파일 병합_자동화 기본편
오늘은 자동화의 기본인 엑셀파일 병합에 대해서 배워보겠다. Python 등의 프로그래밍 언어나 VBA를 통해서 여러 개의 파일을 하나로 병합할 수 있으나 우리의 목적은 최단시간 최고효율이기 때문
serendipity77.tistory.com
엑셀 VBA를 통해서 폴더 내 파일 병합하는 코드도 업로드 하였습니다.
2022.11.22 - [엑셀(Excel)] - [엑셀/VBA] 폴더 내 엑셀파일 한번에 통합하기(엑셀파일병합, 자동화기본)
[엑셀/VBA] 폴더 내 엑셀파일 한번에 통합하기(엑셀파일병합, 자동화기본)
이번에는 엑셀 VBA 기능을 이용해서 폴더 내 파일을 통합해보도록 하겠습니다. 이미 이전 발행 글 중에서 '파워쿼리' 및 '파이썬'을 통해 폴더 내 엑셀파일 통합하는 방법을 다루어보았는데요 엑
serendipity77.tistory.com
1. 상황
- 동일한 형태의 엑셀파일이 월별로 존재
- 파일을 하나씩 열어서 복사 붙여넣기해서 통합된 형태로 관리하고 싶음
- 매출현황_2022.06 파일을 열어보면 '이름', '매출현황' 데이터가 5행씩 존재
- 현재 예시는 6개월 정도치만 5행으로 만들었지만 실무에서는 100개 파일을 10만행씩 있다고 가정하면 될 것 같습니다.
- 어차피 코드는 동일합니다.
2. 라이브러리 로드
import pandas as pd # 엑셀 파일 로드위함
import os # 파일경로 지정
import re # 정규표현식 사용
- pandas, os, re 라이브러리를 로드 합니다.
3. 파일리스트 로드
file_format = ".xlsx" # 파일형태 적으면 됩니다. csv, txt, xlsx, png 등
file_list = [f"{file}" for file in os.listdir() if file_format in file]
file_list
- List Comprehension 방법으로 for 구문을 한 줄로 작성하였습니다.
- for 반복문을 비교해보겠습니다.
- os.listdir()의 경우, 현재 경로에 있는 파일 전부를 출력해달라는 얘기입니다.
- If 문의 경우, file 이름 중 ".xlsx"가 있는 파일만 출력해달라는 말입니다.
- 출력결과 입니다.
- 최종적으로 .xlsx가 마지막에 있는 파일 6개만 잘 나왔습니다.
4. 단순하게 파일 합치기 !
df = pd.DataFrame([]) # 빈 데이터 프레임 만들기
for file in file_list :
temp = pd.read_excel(file)
df = pd.concat([df, temp])
df.shape
- 데이터 합치기 위해서는 무조건 빈 데이터프레임을 하나 만들어야 합니다.
- pd.read_excel로 파일을 하나씩 읽어옵니다.
- concat 함수를 통해서 파일을 합쳐줍니다.
5. 단순하게 파일 합치기 결과
- 파일은 성공적으로 잘 합쳐졌습니다.
- 다만 파일 이름에 월별로 적어두었기 때문에 이 데이터가 몇월의 데이터인지 알기가 어렵습니다.
6. 엑셀 파일로 저장하기
- 엑셀 파일로 저장하는 방법은 매우 매우 간단합니다.
df.to_excel('매출통합파일.xlsx', index = False)
- index = False라고 지정해줘야 새로운 index가 생성되지 않습니다.
- csv파일의 경우에는 df.to_csv("파일이름".csv, index = False)와 같은 형태로 작성해주시면 됩니다.
7. [추가사항] 파일이름의 연월 데이터를 가지고 오기
- 이를 위해, 먼저 정규표현식을 아주 살짝 알아보겠습니다.
- 정규표현식은 별도로 책 한 권을 공부해야할만큼 양이 방대하다고 합니다.
- 현재 파일이름인 "매출현황_2022.06.xlsx" 을 "202206"처럼 변경하고 싶습니다.
import re
re.sub("[^0-9]", '', '매출현황_2022.06.xlsx')
- re.sub(변경하고 싶은 규칙, 변경하고 싶은 모습, 변경해야할 대상) 으로 봐주시면 됩니다.
- "[^0-9]" : [0-9]의 경우 0부터 9까지 모든 숫자를 뜻합니다. 그 앞에 ^가 붙으면 반대를 뜻합니다. 따라서 숫자가 아닌 모든 것이란 뜻입니다.
- 뒤에 '' 은 없애줘 라는 뜻입니다.
- '매출현황_2022.06.xlsx' 에서 숫자가 아닌 모든 부분을 제거한다면 "202206"처럼 나타날 것입니다.
그럼 이제 반복문 사이에 위 식을 넣어주기만 하면 됩니다.
다시 반복문으로 돌아가겠습니다.
df = pd.DataFrame([]) # 빈 데이터 프레임 만들기
for file in file_list :
dates = re.sub("[^0-9]", '', file)
temp = pd.read_excel(file)
temp['Date'] = dates
df = pd.concat([df, temp])
df.shape
dates 라는 변수를 만들어서 파일이름을 "202206"과 같은 형태로 만들어주고 데이터를 삽입합니다.
[결과화면]
- 이제는 Date라는 열이 생겼고, 각 파일의 이름으로 연월 데이터를 구할 수 있습니다.
8. [추가사항] '통합본'의 경우 다른 경로에 저장 추천
- 통합본을 기존 경로에 그대로 저장하는 경우에는 처음에 통합할 때는 문제가 없지만, 앞으로 지속적으로 통합본을 만들 때는 문제가 될 수 있습니다.
- 코드 등으로 통합본과 그렇지 않은 것을 구분할 수도 있습니다만, 별도로 관리하는 것이 훨씬 편합니다.
- 그렇지 않다면 통합본 파일명이 동일하다는 가정하에 통합본을 삭제 후 반복문을 돌리는 방법도 있습니다.
- 다만 삭제하게 된다면 복구가 어려우니 편집한 파일은 다른 폴더에 넣어주는 게 좋습니다.
# 경로에 결과파일 있을 경우 삭제
if os.path.isfile(f'{file_name}.xlsx'):
os.remove(f'{file_name}.xlsx')
- file_name 부분에 "매출통합파일" 이라는 부분을 넣게되면 매출현황을 반복문 돌리기 전에 알아서 "매출통합파일.xlsx"를 지우고 반복문을 돌리게 됩니다.
9. [최종] 전체코드 통합
import pandas as pd # 엑셀 파일 로드위함
import os # 파일경로 지정
import re # 정규표현식 사용
file_format = ".xlsx"
file_name = "매출통합파일"
if not os.path.isfile(f'{file_name}.xlsx'):
file_list = [f"{file}" for file in os.listdir() if file_format in file]
print(file_list)
#파일 통합하기
df = pd.DataFrame([])
for file in file_list :
dates = re.sub("[^0-9]", '', file)
temp = pd.read_excel(file)
temp['Date'] = dates
df = pd.concat([df, temp])
#파일 엑셀파일로 저장
df.to_excel(f'{file_name}.xlsx', index = False)
else :
print("이미 파일이 존재하여 삭제하고 새로 통합하였습니다")
os.remove(f'{file_name}.xlsx')
file_list = [f"{file}" for file in os.listdir() if file_format in file]
#파일 통합하기
df = pd.DataFrame([])
for file in file_list :
dates = re.sub("[^0-9]", '', file)
temp = pd.read_excel(file)
temp['Date'] = dates
df = pd.concat([df, temp])
#파일 엑셀파일로 저장
df.to_excel(f'{file_name}.xlsx', index = False)
이로써 폴더 내에 있는 엑셀 파일 통합하기 완료하였습니다.
이럴꺼면 노가다 복붙하겠다라고 생각이 문득문득 들긴 합니다.. ^^

아무쪼록 업무자동화를 통해 엑셀 노가다 탈출하시길 바랍니다.
감사합니다.

'파이썬(Python)' 카테고리의 다른 글
[파이썬/Python] '아바타2 : 물의 길' 댓글 수집 및 리뷰 분석해보기 (0) | 2023.01.03 |
---|---|
[Python/파이썬] 구글이미지 크롤링 (무한스크롤) (0) | 2023.01.02 |
[파이썬/Python] 영화('동감') 댓글 리뷰 워드 클라우드(wordcloud)로 만들어보기 (0) | 2022.11.20 |
[파이썬/Python] 날짜지만 소수점인 데이터 날짜로 변경해보기(10월이 1월로 변경되지 않도록 하기) (0) | 2022.11.15 |
[파이썬/Python] 분리된 엑셀 시트 하나의 시트로 통합하기 (0) | 2022.11.06 |
댓글