본문 바로가기

코딩/업무자동화

[파이썬/업무자동화] 특정 문자 기준으로 문자열 분리 및 나열

반응형

  파이썬에는 특정 문자를 기준으로 문자열을 분리하여 리스트화 시키는 Split 함수가 있다. 실무에서 어떤 경우에 사용할 수 있을까? 가상의 예시를 아래와 같이 만들어보았다. 각 데이터 종류에 따른 구분 Data가 한 셀에 뭉쳐있다고 해보자.(왼쪽 이미지)

 

< 왼쪽 : 원본 raw data // 오른쪽 : 프로그램을 통한 분리 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) 

 

[Python Excel] 파이썬으로 엑셀 다루기 1편_openpyxl 패키지 소개 및 시트 생성/변경

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 오늘은 파이썬으로 엑셀(Excel)을 다룰 때 가장 많이 사용하는 openpyxl 패키지에 대해 알아보겠습니다. 엑셀은 회사에서 업

coding-kindergarten.tistory.com

 

 

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)


 

-. 위 코드를 활용하기 위한 샘플 데이터 및 코드를 아래 첨부.

TextSeperate.zip
0.00MB

 

728x90