파이썬에는 특정 문자를 기준으로 문자열을 분리하여 리스트화 시키는 Split 함수가 있다. 실무에서 어떤 경우에 사용할 수 있을까? 가상의 예시를 아래와 같이 만들어보았다. 각 데이터 종류에 따른 구분 Data가 한 셀에 뭉쳐있다고 해보자.(왼쪽 이미지)
위 예시는 3가지 데이터지만 현업에서는 raw 데이터가 최소 몇백가지, 몇천가지가 될 수 있다. 해당 데이터를 엑셀에서 의미있는 Data로 만들려면 오른쪽 이미지 처럼 구분해야 한다. 분리하는 기능을 코딩으로 자동화하면 굉장히 유용하게 활용할 수 있다. 이전에 엑셀 VBA를 활용해서 위와 같은 경우의 Data를 구분하도록 정리한 내용이 있으니 관심있는 사람은 참고하면 좋을 것 같다.
(참고링크 : 2021.05.20 - [코딩/엑셀,VBA] - [엑셀 VBA] Split , Ubound 함수 설명 및 예시)
이번 포스팅은 파이썬에 대한 내용이므로 파이썬의 Split 함수를 통해 위 기능을 구현해본다. 함수는 크게 3가지로 구분하여 코드를 작성하였다.(ReadExcel, SeperateText, WriteExcel)
1. 모듈 import
-. 엑셀을 읽고 쓰기 위해 openpyxl 모듈을 사용하였다.
import openpyxl as op
-. openpyxl 모듈 에 대한 기초적인 내용은 이번 포스팅에서 다루지 않는다. 대신 '코딩유치원'이라는 블로그에서 잘 정리한 내용이 있어 아래 블로그를 참고하면 좋을 것 같다.
(참고링크 : https://coding-kindergarten.tistory.com/75?category=973260)
2. 함수 설명
위에서 언급하였던 3가지 함수에 대해 간단히 정리해보았다. 전체 코드는 하단에 첨부하였으니 참고!
1) ReadExcel
-. Raw data 엑셀파일 경로를 받아 각 열의 데이터를 리스트화한다.
-. 데이터를 리스트화한 코드는 리스트 컴프리헨션 구문을 사용하엿다.
-. 리턴값은 각 열에 대한 데이터 리스트이다.
<코드>
#엑셀의 데이터를 읽어오는 함수 정의
def ReadExcel(path):
# 엑셀 워크북 및 객체 생성(path는 rawdata 경로이다.)
wb = op.load_workbook(path)
ws = wb.active
# raw data의 A열, B열을 각각 리스트화 한다.
category = [r[0].value for r in ws]
data = [r[1].value for r in ws]
# 위 리스트 2개를 리턴한다.
return category, data
-. 위 코드의 category와 data를 출력해보면 아래와 같다. 각 열이 리스트화된 것을 확인할 수 있다.
<결과>
# category 출력 결과
['종류', '과일', '육류', '숫자']
# data 출력 결과
['내용', '사과,바나나,귤,수박', '닭고기,항정살,삼겹살,오겹살,꽃등심', '1,2,3,4,5,6,7,11']
2) SeperateText
-. ReadExcel에서 리턴한 category와 data를 입력받는다.
-. 각 분류에 대한 세부 data인 문자열들을 문자 콤마(',')기준으로 분리하여 리스트화한다.
-. 파이썬의 split 함수는 문자열을 특정 문자 기준으로 분리하여 리스트화하는 대표적인 문자열 함수이다.
* 파이썬 split 함수 사용법 문자열.split('구분자') |
<코드>
#종류, 내용열을 입력받아서 문자열을 분리 및 튜플로 만듬. 튜플을 다시 리스트화
def SeperateText(category, data):
i=0 # 종류를 표시하는 인덱스
temp_list = [] #분리한 결과 데이터(튜플)을 저장하기 위한 빈 리스트 정의
for d in data:
temp_text = d.split(',') # data열에서 data를 콤마기준으로 분리하여 리스트화
#위에서 리스트화한 temp_text를 다시 for문 진행
for text in temp_text:
temp_tuple = (category[i], text) #종류, 분리한 데이터를 튜플화
temp_list.append(temp_tuple) # 튜플을 리스트에 추가
i = i+1
return temp_list # 결과 리스트를 리턴(각 요소는 튜플)
<결과>
-. 결과는 튜플로 이루어진 리스트이다.
-. 위 temp_list를 출력해보면 아래와 같다.
[('종류', '내용'), ('과일', '사과'), ('과일', '바나나'), ('과일', '귤'), ('과일', '수박'), ('육류', '닭고기'), ('육류', '항정살'), ('육류', '삼겹살'), ('육류', '오겹살'), ('육류', '꽃등심'), ('숫자', '1'), ('숫자', '2'), ('숫자', '3'), ('숫자', '4'), ('숫자', '5'), ('숫자', '6'), ('숫자', '7'), ('숫자', '11')]
3) WriteExcel
-. SeperateText 함수에서 리턴한 temp_list를 입력받아서 새로운 엑셀파일에 입력하여 저장하는 함수이다.
-. 아래 코드를 실행하면 결과 엑셀파일(result.xlsx)을 확인할 수 있다.
<코드>
def WriteExcel(data_list):
wb_result = op.Workbook() #새로운 엑셀파일 열기
ws_result = wb_result.active #엑셀파일의 활성화시트 설정
i=1
for data in data_list: #입력받은 리스트를 for문을 통해 엑셀에 입력
ws_result.cell(row=i, column=1).value = data[0] # 해당 리스트 튜플의 첫번재 요소
ws_result.cell(row=i, column=2).value = data[1] # 해당 리스트 튜플의 두번째 요소
i=i+1
wb_result.save("result.xlsx") #결과 엑셀파일을 파이썬 실행파일 폴더에 저장
<결과>
3. 전체 코드 및 파일 첨부
<전체 코드>
import openpyxl as op
def ReadExcel(path):
wb = op.load_workbook(path)
ws = wb.active
category = [r[0].value for r in ws]
data = [r[1].value for r in ws]
return category, data
def SeperateText(category, data):
i=0
temp_list = []
for d in data:
temp_text = d.split(',')
for text in temp_text:
temp_tuple = (category[i], text)
temp_list.append(temp_tuple)
i = i+1
print(temp_list)
return temp_list
def WriteExcel(data_list):
wb_result = op.Workbook()
ws_result = wb_result.active
i=1
for data in data_list:
ws_result.cell(row=i, column=1).value = data[0]
ws_result.cell(row=i, column=2).value = data[1]
i=i+1
wb_result.save("result.xlsx")
if __name__ == "__main__" :
path = "원본엑셀파일경로"
odata = ReadExcel(path)
sdata = SeperateText(odata[0], odata[1])
WriteExcel(sdata)
-. 위 코드를 활용하기 위한 샘플 데이터 및 코드를 아래 첨부.
'코딩 > 업무자동화' 카테고리의 다른 글
[파이썬/업무자동화] 엑셀 파일 시트별 pdf 저장/변환하기 (18) | 2021.06.21 |
---|---|
[파이썬/업무자동화] 여러 폴더 안에 있는 파일명 한번에 바꾸기 2편 (5) | 2021.06.16 |
[파이썬/업무자동화] 여러 폴더 안에 있는 파일명 한번에 바꾸기 1편 (1) | 2021.06.01 |
[파이썬/업무자동화] Outlook 메일 첨부 엑셀 내용 자동 취합하기 (0) | 2021.04.28 |
[파이썬/업무자동화] YES24 전용 도서 구매 자동화 프로그램 -Selenium 응용 (6) | 2021.04.04 |