위니브 엠버서더

[위니브 엠버서더 3기] Python 엑셀 프로그래밍 - with xlsxwriter 수강 후기

하양 :) 2024. 8. 23. 10:44
반응형

강의 선택 이유

 

 

 

사실 나는 자동화 업무를 개발하고 운영관리하는 일을 하고 있다. 

다만 RPA 특성상 직접 크롤링을 하는 모듈이나 라이브러리를 사용하여 코딩하지 않고, 이미 하나의 모듈로 다 만들어져있는 액티비티라는 로우코드를 활용해 로직을 짜는 일을 한다.

 

그래서 Python으로 직접 크롤링 + 전처리를 해볼 수 있게 코드를 짜는 것을 연습하고 싶어 이 강의를 신청하게 됐다.

 

 

 

강의 구성

 

 

 

 

xlsxwriter

 

크롤링해온 데이터를 전처리하고 엑셀에 입력하는 것은 xlsxwriter 모듈을 이용하게 된다.

 

크롤링에 대한 내용보다는, 크롤링해온 데이터를 어떻게 가공해서 엑셀에 넣는지에 대한 연습을 하는 것이

이 강의에 더 맞는 목적인 것 같다.

 

 



 

 

 

 

강의 요약

 

 

Python 엑셀 프로그래밍 (xlsxwriter)

 

▶ xlsxwriter 를 활용하여 데이터를 어떻게 엑셀에 입력하는지 처음에 배우게 된다.

 

# xlsxwriter를 불러오기
import xlsxwriter

# 엑셀 파일을 생성하고, sheet를 만들기
workbook = xlsxwriter.Workbook('tutorial_1_1.xlsx')
worksheet = workbook.add_worksheet('jejucodingcamp')


# 값을 넣거나, 산술연산도 가능
worksheet.write('A2', '=A1+B1')
worksheet.write('B2', '=A1=B1')


worksheet.write('A3', '=SUM(A1,B1)')
worksheet.write('B3', '=IMSUB(A1,B1)')
worksheet.write('C3', '=PRODUCT(A1,B1)')
worksheet.write('D3', '=QUOTIENT(A1,B1)')


# 만약 수식이 잘못됐을 경우에는, 엑셀파일을 열 때 에러가 발생함!!!

# close 안 하면 파일이 생성이 안 됨, 마지막에 꼭 close 필수!!
workbook.close()

 

 

 

-----------------------------------------------------------------------------------------------------

 

 

2.  Write 메소드

 

이 강의의 궁극적인 목표는 결국 데이터를 가공해서, 엑셀에 정리하는 업무 자동화를 이뤄내는 것이다.

 

따라서 가장 많은 시간을 할애하는 부분이 엑셀 작성 부분이라고 느꼈다.

 

write 메소드에 대해 자세히 다뤄주신다.

 

 

 

# 사용 가능한 메소드의 종류를 보는 방법

dir(workbook)
dir(worksheet)


# write 메소드 : 워크시트.write(행번호, 열번호, 입력값)
# write 메소드를 쓰면 기입하는 데이터의 형식에 따라서, 메소드가 다른 것들이 호출됨

worksheet.write(0, 0, 'Excel') 
# -> write_string() 호출됨

worksheet.write(1, 0, 3) 
# -> write_number() 호출됨

worksheet.write(2, 0, '=COS(PI()/4)')  
# -> write_formula() 호출됨

worksheet.write(3, 0, '') 
# -> write_blank 호출됨

worksheet.write(4, 0, None)
# -> write_blank 호출됨

 

 

  서식 지정날짜에 관한 메소드도 배울 수 있었다.

 

# 셀 서식 설정
cellFormat = workbook.add_format({'bold':True, 'italic':True})

worksheet.write(0, 0, 'hello world', cellFormat)

# 사용할 수 있는 서식 종류 확인
https://xlsxwriter.readthedocs.io/format.html



=========================================================

# 날짜 메소드

1. 엑셀 날짜 수식 이용

worksheet.write(0, 0, '=DATEVALUE("1-Jan-2020")')


2. Python 자체 메소드 이용

import datetime

# 날짜 값
date_time = datetime.datetime.strptime('2020-5-6', '%Y-%m-%d')

# 현재 날짜로 대입히려면??
# ->> datetime.datetime.now()

# 출력할 형식
date_format = workbook.add_format({'num_format': 'd mmmm yyyy'})

# add_format({'num_format': 'd mmmm yyyy'})                 # 20.4.16
# add_format({'num_format': 'yyyy-mm-dd'})                  # 2020.4.16
# add_format({'num_format': 'yy/mm/dd hh:mm'})              # 20/4/16 12:00
# add_format({'num_format': 'yyyy mmm dd'})                 # 2020 Apr 16
# add_format({'num_format': 'yyyy mmm dd hh:mm AM/PM'})     # 2020 Apr 16 12:00 PM


worksheet.write(0, 0, date_time, date_format)

 

 

-----------------------------------------------------------------------------------------------------

 

3. 각종 파일들을 열어 읽고 쓰는 방법

 

 

  txt파일, csv파일, json 파일에 대해 다뤘다.

 

 

1. txt 파일

<txt 파일 쓰기 모드>

# 열 때 쓰기 모드로 열고 write 메소드로 이어서 쓰기
file = open('./data/tutorial_2_1_1.txt', 'w')

for i in range(10):
    data = f'양 {i} 마리 \n'
    file.write(data)


file.close()

=====================================================

<txt 파일 읽기 모드>

# 읽기 모드 'r' 로 열고 작업
file = open('./data/tutorial_2_1_1.txt', 'r')


# readline 은 1줄만 읽어옴
data = file.readline()
print(data)

file.close()

=====================================================

# readline으로 여러줄 읽어오려면

file = open('./data/tutorial_2_1_1.txt', 'r')

while True:
    data = file.readline()
    print(data)
    if not data:
        break

file.close()

=====================================================

# 메소드로 여러줄 읽어오려면

file = open('./data/tutorial_2_1_1.txt', 'r')

data = file.readlines()

print(data)

file.close()

=====================================================

<append 모드로 이어서 쓰기>

# append 모드로 열고 작업 시작
file = open('./data/tutorial_2_1_1.txt', 'a')


for i in range(10):
    data = f'소 {i} 마리 \n'
    file.write(data)


file.close()

 

 

-------------------------------------------------------------

 

2. csv 파일

<csv 파일 쓰기 모드>

# 열 때 쓰기 모드로 열고 write 메소드로 이어서 쓰기
file = open('./data/tutorial_2_1_1.csv', 'w')

for i in range(10): # 다음 행에 같은 것을 반복해서 총 10행 
    for j in range(5): # 1. 한 행에 5개 입력하고
        data = f'TEST {i} {j} 위치,'
        file.write(data)
    data = f'\n' # 2. 개행 한번 해주고
    file.write(data)

file.close()

 

 

-------------------------------------------------------------

 

3. json 파일 

 

json 데이터를 딕셔너리로 디코딩해서 사용하는 방법과

 

딕셔너리를 json으로 변경하여 사용하는 방법 2가지가 있다.

 

 

<json -> 딕셔너리> : loads 사용

import json

jsonString = '''{
    "이름" : "이호준",
    "나이" : "10",
    "번호" : "010-0000-0000",
    "주소" : "제주도 제주시"
    }'''

# string 형태의 json -> 딕셔너리 디코딩
json_de = json.loads(jsonString)

json_de
# {'이름': '이호준', '나이': '10', '번호': '010-0000-0000', '주소': '제주도 제주시'}




==============================================


<딕셔너리 -> json> : dumps 사용

jsonString = {
    "이름" : "이호준",
    "나이" : "10",
    "번호" : "010-0000-0000",
    "주소" : "제주도 제주시"
    }

# json 디코딩
# 아스키 형태의 문자열로 깨지지 않기하기 위한 옵션 "ensure_ascii"
# 보기 좋게 정렬하려면 "indent" 로 들여쓰기 수치 조절

s = json.dumps(jsonString, ensure_ascii=False, indent=4)

print(s)
# 
{
    "이름": "이호준",
    "나이": "10",
    "번호": "010-0000-0000",
    "주소": "제주도 제주시"
}

 

 

-----------------------------------------------------------------------------------------------------

 

 

4. 한글 파일 크롤링

 

olefile, ole-py를 사용해서 한글 파일의 텍스트를 한번에 읽어오고,

해당 텍스트에서 필요한 데이터만 뽑아내는 처리를 하는 것을 배우게 된다.

 

사실상 크롤링하는 작업은

import ole

with ole.open('./data/입사지원서.hwp') as f:

    # 한글 파일의 ole 구조 출력해보기
    # print(f.list_streams())

    # 그 중에서 PrvText에 해당하는 스트림을 읽어오기
    data = f.get_stream('PrvText').read().decode('utf-16le')

splitData = data.split('><')

 

 

이렇게 라이브러리를 통해서 간단하게 이루어지지만 가져온 텍스트에서 원하는 것을 뽑아내는 것이 늘 복잡하다.

 

['이  력  서\r\n<인적사항',
 '성          명',
 '홍길동',
 '생  년  월  일',
 '1993년 8월 13일',
 '현    주    소',
 '제주특별자치도 제주시',
 '연    락    처',
 '010-2233-1478',
 '이    메    일',
 'ab8ab@naver.com>\r\n\r\n<학력사항',
 '학교명',
 '전공',
 '성적',
 '졸업구분',
 '소재지',
 '건국대학교',
 '컴퓨터공학과',
 '4.1/4.5',
 '졸업',
 '서울>\r\n\r\n<자격면허',
 '자격면허증명',
 '시행기관',
 '취득년월',
 'TOEIC',
 '점수',
 '정보처리기사',
 '한국산업인력공단',
 '19.05.22',

 

이런식으로 값을 split해주기 때문에.. 원하는 소제목의 index를 찾아서 그 다음것을 들고와라.. 

라는 식의 반복문을 만들어 정리하게 된다.

 

 

 

 

 

-----------------------------------------------------------------------------------------------------

 

 

5. pdf 크롤링

 

pdf도 마찬가지로 pdfminer라는 것을 사용해서 뽑아온다.

강의에서도 해당 내용을 자세히 다루진 않고, 역시 뽑아온 텍스트를 어떻게 전처리하여 사용하는지에 초점이 맞춰져있다.

 

# pdf 크롤링하는 법

from io import StringIO

from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser

output_string = StringIO()

with open('./data/입사지원서.pdf', 'rb') as in_file:
    parser = PDFParser(in_file)
    doc = PDFDocument(parser)
    rsrcmgr = PDFResourceManager()
    device = TextConverter(rsrcmgr, output_string, laparams=LAParams())
    interpreter = PDFPageInterpreter(rsrcmgr, device)

    for page in PDFPage.create_pages(doc):
        interpreter.process_page(page)

output_string.getvalue()

 

 

이런식으로 보기 어렵게 나와있는 데이터에서 원하는 것을 뽑아내는 것이 업무 자동화의 핵심이다.

 

 

-----------------------------------------------------------------------------------------------------

 

 

6. 그래프 그리기

 

텍스트 데이터 외에, 데이터를 사용하여 그래프를 그리거나 이미지를 엑셀에 첨부하는 것도 

충분히 가능하다.

 

해당 내용들은 강의에서 자세히 알아볼 수 있으니 관심이 있는 분들은 강의를 수강해보면 많은 도움이 될 듯!

 

 

 

-----------------------------------------------------------------------------------------------------

 

 

 

수강 후기

 

 

매일 같은 작업을 반복하고, 같은 형식의 결과물을 내야하는 회사원들에게 아주 유용한 강의가 될 것 같다.

 

Python 에 대해 잘 모르더라도 제공되는 템플릿을 좀 응용할 수 있는 정도로만 공부를 하게 된다면

공부에 할애한 시간 그 이상으로 많은 효율을 누릴 수 있게 될 것이다.

 

실제로 RPA로 많은 기업들이 비용을 들여가며 이러한 반복 작업을 최소화하고 있는데

이러한 일을 저렴한 비용으로 공부하고 본인의 업무에 활용하여 괴로운 반복작업에서 수고를 덜 수 있다는 게 

이 강의의 가장 큰 매력이 아닐까 싶다.

 

매일 비슷한 결과보고서를 도출해내야하는 직장인, 같은 형식의 데이터를 매일 입력하는 작업이 필요한 사람들..

 

모두에게 이 강의를 추천하고 싶다.

 

 

 

 

 

 

 

 

 

 

반응형