반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 


오늘은 지난 시간의 엑셀 시트 취합 프로젝트의 업그레이드 버전을 가져와봤습니다.

 

이번 프로그램의 컨셉은 아래와 같습니다. 참고로 해당 프로젝트는 제품 모델당 자동으로 생성되는 Report들을 한번에 취합해서 프린팅 하기 위한 프로그램입니다.

 

수 십, 수 백개의 엑셀 파일을 하나씩 열어가며 인쇄 버튼을 누르는 것보다 훨씬 시간을 절약할 수 있겠죠?

 

1. 전체 코드

 

코드에 대한 설명은 주석으로 대체하도록 하겠습니다. 최대한 자세히 달아두었으나 이해가지 않으시는 부분은 댓글로 질문해주세요!

 

# step1.관련 모듈 및 패키지 import
import glob
import win32com.client
import tkinter
from tkinter import filedialog
import os

# step2.폴더 선택 (Tkinter)
root = tkinter.Tk()
root.withdraw()
path = filedialog.askdirectory(parent=root, initialdir="./", title="폴더를 선택 해 주세요")

# step3.glob 모듈로 원하는 폴더 내의 모든 xlsx 파일의 경로를 리스트로 반환
list_filepath = glob.glob(path + '/**/*.xlsx', recursive=True)

# step4.역슬레시로 출력되는 부분 슬레시로 변환
list_filepath_slash = [i.replace("\\", "/", 5) for i in list_filepath]

# step5.복사한 시트의 이름을 각 Report가 존재하는 폴더 이름으로 변경해주기 위한 폴더명 리스트
list_folder_name = os.listdir(path)

# step6.win32com(pywin32)를 이용해서 엑셀 어플리케이션 열기
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = True #실제 작동하는 것을 보고 싶을 때 사용

# step7.엑셀 어플리케이션에 새로운 Workbook 추가
wb_new = excel.Workbooks.Add()

# step8.엑셀 시트를 추출하고 새로운 엑셀에 붙여넣는 반복문
for i, filepath in enumerate(list_filepath_slash):

    # 받아온 엑셀 파일의 경로를 이용해 엑셀 파일 열기
    wb = excel.Workbooks.Open(filepath)

    # 새로 만든 엑셀 파일에 추가
    # 추출할wb.Worksheets("추출할 시트명").Copy(Before=붙여넣을 wb.Worksheets("기준 시트명")
    wb.Worksheets("1번 문서").Copy(Before=wb_new.Worksheets("Sheet1"))
    
    # 시트명을 원래 Report 파일이 존재하던 폴더명으로 변경 
    ws = wb_new.Worksheets('1번 문서')
    ws.Name = list_folder_name[i]
    
    # copy 작업이 끝난 Workbook 종료
    wb.Close()

# 처음 새로운 엑셀파일이 생성될 때 존재하는 "Sheet1" 시트 삭제
wb_new.Worksheets("Sheet1").Delete()

# step6. 취합한 엑셀 파일을 "통합 문서"라는 이름으로 저장
wb_new.SaveAs(r"C:\Users\SANGWOO\Desktop\VSCODE\통합 문서.xlsx")

# step7. 켜져있는 엑셀 및 어플리케이션 모두 종료
excel.Quit()

 

2. 새롭게 알게 된 점

 

1)  윈도우의 기준, 파일 혹은 폴더 경로에 /(슬레시)와, \(역슬레시)가 섞여서 들어가면 에러가 난다

 

아래의 코드와 같이 Tkinter로 폴더 경로를 선택한 후, glob 모듈로 하위 폴더 내의 모든 xlsx파일의 경로를 리스트로 받아서 출력해보니 다음과 같이 출력되었습니다. 

 

해당 문제는 전체 코드에서는 개선하여 반영하였습니다.

 

import glob
import tkinter
from tkinter import filedialog

root = tkinter.Tk()
root.withdraw()
path = filedialog.askdirectory(parent=root, initialdir="./", title="폴더를 선택 해 주세요")
print("path : ", path)

list_filepath = glob.glob(path + '/**/*.xlsx', recursive=True)

for i in list_filepath:
    print(i)

 

<출력 결과>

path :  C:/Users/SANGWOO/Desktop/VSCODE/엑셀 시트 취합
C:/Users/SANGWOO/Desktop/VSCODE/엑셀 시트 취합\1번 제품\Report.xlsx
C:/Users/SANGWOO/Desktop/VSCODE/엑셀 시트 취합\2번 제품\Report.xlsx
C:/Users/SANGWOO/Desktop/VSCODE/엑셀 시트 취합\3번 제품\Report.xlsx
C:/Users/SANGWOO/Desktop/VSCODE/엑셀 시트 취합\4번 제품\Report.xlsx
C:/Users/SANGWOO/Desktop/VSCODE/엑셀 시트 취합\5번 제품\Report.xlsx

 

 

2) win32com으로 엑셀을 다룰 때, 같은 이름의 엑셀 파일이 열리면 아래와 같은 오류가 발생한다

 

아래와 같은 에러를 띄우면서 시트를 복사하는 부분에서 걸리는 문제가 발생해서 원인을 찾다보니, Report라는 엑셀 파일을 열고 닫지 않고 그다음 폴더의 Report 파일을 열어서 문제가 발생하는 것을 파악하였습니다.

 

이를 해결하기 위해서는 wb.Close( ) 명령을 사용해야합니다.

 

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-42-3f47d6541631> in <module>
     39     # 새로 만든 엑셀 파일에 추가
     40     # 추출할wb.Worksheets("추출할 시트명").Copy(Before=붙여넣을 wb.Worksheets("기준 시트명")
---> 41     wb.Worksheets("1번 문서").Copy(Before=wb_new.Worksheets("Sheet1"))
     42 
     43 # 처음 새로운 엑셀파일이 생성될 때 존재하는 "Sheet1" 시트 삭제

AttributeError: 'NoneType' object has no attribute 'Worksheets'

 

직접 동일명 엑셀 파일을 열었을 때 출력되는 메시지

 

 

3) win32com으로 엑셀 시트 이름을 바꾸는 방법

 

ws = wb.Worksheets('변경 전 시트 이름')

ws.Name = '변경 후 시트명'

 

 


 

<참고 자료>

 

https://url.kr/jqxl4b

 

파이썬 Replace, 폴더 디렉토리 경로 "\"→"/" 자동 변경 방법 (Python)

파이썬을 활용해서 머신러닝, 이미지 프로세스 관련 개발을 하면서 폴더 혹은 디렉토리 경로를 입력하는 일이 많습니다. 하지만, 컴퓨터에서 사용되는 경로에는 역슬래쉬인 "\"가 사용되며, 파

muzukphysics.tistory.com

 

https://stackoverflow.com/questions/31330941/python-win32-excel-copy-worksheet-and-change-name-of-copied-worksheet

 

python win32 excel copy worksheet and change name of copied worksheet

I'm trying to use python win32 excel application in order to: 1) copy a worksheet 2) change the name of the copied worksheet Using the following code: from win32com.client import Dispatch xl =

stackoverflow.com

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

Win32com 모듈을 사용하려면 pywin32라는 패키지를 설치하셔야 합니다.

 

설치 방법은 지난 글을 참고해주세요.

 

2021.12.12 - [파이썬 패키지/엑셀] - [파이썬 엑셀/PyWin32 ] 개별 엑셀 파일의 특정 시트들을 새로운 엑셀 파일에 모두 합치기 (ft. Openpyxl로는 못함)


오늘은 하나의 엑셀 파일에 있는 엑셀 시트를 각각 분리해서 엑셀 파일로 저장해보는 프로젝트를 해보겠습니다.

 

대략적인 컨셉은 다음과 같습니다. 

 


 

1. 전체 코드

 

코드에 대한 설명은 주석으로 대체하도록 하겠습니다. 최대한 자세히 달아두었으나 이해가지 않으시는 부분은 댓글로 질문해주세요!

 

# step1.관련 모듈 및 패키지 import
import win32com.client

# step2.win32com(pywin32)를 이용해서 엑셀 어플리케이션 열기
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = True #실제 작동하는 것을 보고 싶을 때 사용

# step3. 분리할 엑셀 파일이 있는 폴더 경로
path = r"C:\Users\SANGWOO\Desktop\VSCODE\엑셀 시트 분리"+"/"

# step4.분리하고자 하는 엑셀 통합문서 가져오기
wb = excel.Workbooks.Open(path + "통합 문서.xlsx")

# step5.통합문서의 엑셀 시트들의 이름을 리스트로 받기
Sheet_list = [sheet.Name for sheet in wb.Sheets]

# step6. 엑셀 시트 분리 및 저장 반복문
for sheet in Sheet_list:
    
    # 시트를 분리 저장할 새로운 엑셀 파일 open
    wb_new = excel.Workbooks.Add()

    # 통합문서의 시트 하나를 새로운 엑셀 문서에 copy
    wb.Worksheets(sheet).Copy(Before=wb_new.Worksheets("Sheet1"))
    
    # 처음 새로운 엑셀파일이 생성될 때 존재하는 "Sheet1" 시트 삭제
    wb_new.Worksheets("Sheet1").Delete()
    
    # 기존 경로에 시트명을 파일명으로 엑셀 파일 저장
    wb_new.SaveAs(path + sheet + ".xlsx")

# step7. 켜져있는 엑셀 및 어플리케이션 모두 종료
excel.Quit()

 

 

2. 새롭게 알게 된 점

 

1) win32com 모듈로 엑셀 시트 이름 얻는 법 & 리스트로 저장

 

# step5.통합문서의 엑셀 시트들의 이름을 리스트로 받기
Sheet_list = [sheet.Name for sheet in wb.Sheets]

 

<참고 링크>

 

2) win32com 모듈로 엑셀 시트 삭제하는 법

 

    # 삭제할 시트가 있는 wb.Worksheets("삭제할 시트명").Delete()
    
    wb.Worksheets("Sheet1").Delete()

 

 


오늘 준비한 내용은 여기까지입니다.

 

이 글이 도움이 되셨다면, 좋아요나 댓글을 남겨주세요. 블로그를 운영하는데에 큰 힘이 됩니다.

 

감사합니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 


오늘은 제목과 같이 개별 엑셀 파일의 특정 시트들을 새로운 엑셀 파일에 모두 합치는 파이썬 프로그램을 만들어 보겠습니다.

 

대략적인 컨셉은 다음과 같습니다. 보시다시피 이번 시간에는 openpyxl 대신에 Windows OS에서 Office 프로그램을 제어해 줄 수 있는 Pywin32 패키지를 사용하였습니다.

 

 

자세한 개념에 대한 설명은 아래의 링크를 참고해주시고, 저는 코드 설명만 드리도록 하겠습니다.

 

https://wikidocs.net/153820

 

2) win32com 통해 엑셀 다루기 - 1편

win32com에 속한 client라는 모듈을 활용하여 엑셀을 제어할 수 있습니다. 이번 편에서는 win32com.client를 이용해서 엑셀을 제어하는 기본적인 방법에 ...

wikidocs.net

 


 

1. 전체 코드

 

코드에 대한 설명은 주석으로 대체하도록 하겠습니다. 최대한 자세히 달아두었으나 이해가지 않으시는 부분은 댓글로 질문해주세요!

 

# step1.관련 모듈 및 패키지 import
import glob
import win32com.client

# step2.win32com(pywin32)를 이용해서 엑셀 어플리케이션 열기
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = True #실제 작동하는 것을 보고 싶을 때 사용

# step3.엑셀 어플리케이션에 새로운 Workbook 추가
wb_new = excel.Workbooks.Add() 

# step4.glob 모듈로 원하는 폴더 내의 모든 xlsx 파일의 경로를 리스트로 반환
list_filepath = glob.glob(r'C:\Users\SANGWOO\Desktop\VSCODE\엑셀 샘플\*.xlsx', recursive=True)

# step5.엑셀 시트를 추출하고 새로운 엑셀에 붙여넣는 반복문
for filepath in list_filepath:

    # 받아온 엑셀 파일의 경로를 이용해 엑셀 파일 열기
    wb = excel.Workbooks.Open(filepath)
    
    # 새로 만든 엑셀 파일에 추가
    # 추출할wb.Worksheets("추출할 시트명").Copy(Before=붙여넣을 wb.Worksheets("기준 시트명")
    wb.Worksheets("코딩유치원").Copy(Before=wb_new.Worksheets("Sheet1"))

# step6. 취합한 엑셀 파일을 "통합 문서"라는 이름으로 저장
wb_new.SaveAs(r"C:\Users\SANGWOO\Desktop\VSCODE\엑셀 샘플\통합 문서.xlsx")

# step7. 켜져있는 엑셀 및 어플리케이션 모두 종료
excel.Quit()

 

 

2. 새롭게 알게 된 점

 

1) openpyxl은 Workbook끼리 Sheet이동이 되지 않는다.

 

for filepath in list_filepath:
    
    wb = op.load_workbook(filepath)
    
    ws = wb["코딩유치원"]
    
    wb_new.copy_worksheet(ws)
    
    wb_new.save("통합 문서.xlsx")

 

위의 코드로 시트 이동을 시도해보았으나 아래와 같은 에러를 출력했습니다.

 

ValueError: Cannot copy between worksheets from different workbooks

 

 

2) Pywin32 패키지는 Windows OS 전용이다. (Mac OS에 MS 프로그램이 있어도 안됨)

 

아래의 사진은 Mac OS에서 pywin32를 설치하려 했을 때 출력되는 에러입니다.

제가 잘 못해서 그럴 가능성도 있지만, 애초에 pywin32가 윈도우 전용 패키지가 아닐까 생각됩니다.

 

 

3) Pywin32 패키지 설치방법

 

Windows에서 주피터 노트북을 이용해서 pywin32를 설치하니 커널이 먹통이 되는 문제가 발생했습니다.

 

해결책은 Anaconda 인터프리터를 사용할 때에는 pip가 아닌 conda로 install 해주어야 하는 것이었습니다.

 

conda install -c anaconda pywin32

 

<참고한 블로그>

https://gentlesark.tistory.com/112

 

 


오늘 준비한 내용은 여기까지입니다.

 

이 글이 도움이 되셨다면, 좋아요나 댓글을 남겨주세요. 블로그를 운영하는데에 큰 힘이 됩니다.

 

감사합니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 


오늘은 예전에도 겪었던 openpyxl 문제가 다시 발생하여 기록 및 공유 겸 짧게 글을 써보려 합니다.

 

파이썬으로 엑셀을 다루게 해주는 openpyxl 패키지는,

 

시트(sheet)에 존재하는 값이 입력된 가장 마지막 열을 파악해야 할 때, ws.max_row를,

마지막 열이 정확히 어디인지 모르지만 전체 열을 범위로 넣고 싶을 때ws.rows를 사용합니다.

 

그런데 이때 가끔씩 빈 공간을 마치 값이 입력된 것처럼 인식할 때가 있습니다. 없는데 있는 그런 모순된 상황입니다.

 

결론부터 말씀드리면 무엇인가 썼다가 지웠거나, 셀 서식이 들어가 있으면 해당 셀 공간이 빈공간이 아닌 것 처럼 인식합니다.

 

해결 방법은 아래에서 설명드리겠습니다.

 

1. 문제 현상

 

자, 아래에서 예시를 통해서 좀 더 자세히 보여드리겠습니다.

 

아래의 그림을 보시면, 6번행까지 값이 입력되어 있습니다. 단, 7,8,9번행까지 제가 다른 것을 썼다가 지운 상태입니다.

 

테스트용 출석부.xlsx

 

간단한 코드로 ws.rows가 어떻게 사용되고 작동하는지 살펴보겠습니다. 의도한 출력결과는 값이 입력된 마지막 행을 파악하고 그 전의 행들을 모두 출력하는 것입니다. 참고로 여기서 출력하는 것은 값이 아니라 Cell 객체입니다.

 

import  openpyxl

# "출석부.xlsx"라는 이름의 엑셀파일 불러오기
wb = openpyxl.load_workbook("출석부.xlsx")

# 불러운 엑셀파일에서 "1반"이라는 이름을 가진 sheet 가져오기
ws = wb["1반"]

# ws.rows로 가장 마지막 행을 파악, 행을 한줄씩 출력
for  row  in  ws.rows:
    print(row)

 

<정상적인 실행 결과>

 

<잘못된 실행 결과>

 

분명히 아무것도 존재하지 않는데 9번 행을 시트의 마지막 행으로 잡았습니다.

 

 

2. 해결 방법

 

해결 방법은 간단합니다.

 

주변의 진짜 순수한(?) 떼뭍지 않은(?) 셀을 잘라내기해서 문제가 되는 영역에 붙여넣는 것입니다.

 

 


누군가에게 도움이 되었길 기대하며 글을 마칩니다.

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

<Pyinstaller 관련 지난 글>

 

2021.06.08 - [파이썬 패키지/실행파일 배포] - [Python / PyInstaller] 파이썬 프로그램 실행 파일로 만들어서 배포하는 방법 (ft. exe 파일 용량 줄이는 팁)

 

오늘은 지난 시간에 알아보았던 파이썬 용량 줄이는 방법을 제가 직접 수행하면서 새롭게 알게 된 내용을 공유드리겠습니다.

 

1. exe 파일의 과용량 원인

 

예전에 제가 만든 간단한 크롤링 GUI 프로그램의 용량이 200~300MB로 되는 문제가 있어서 여기저기 많이 찾아보니, 

그 원인은 잘 이해는 가지 않지만 'conda와 pyinstaller가 잘 맞지 않아서' 였습니다.

 

저의 경우엔 아나콘다 패키지로 파이썬을 설치했었고, 아나콘다 패키지의 파이썬 인터프리터와 conda 기반의 패키지 관리 환경에 설치된 numpy와 pandas 같은 패키지들이 큰 용량으로 포함되었습니다. numpy와 pandas를 사용하지 않은 코드였는데도요!!

 

2. 임시 해결방안

 

그 당시 저는 가상환경 셋팅법이 너무 어려워서 아래와 같은 방법을 사용했었습니다.

 

Anaconda의 가상환경(제가 주로 사용하는 'base': conda)를 그대로 사용하면서 '--exclude 패키지명' 옵션으로 특정 패키지 제외

 

# 가장 큰 패키지인 pandas와 numpy 제외
pyinstaller -F -w --exclude pandas, --exclude numpy 파이썬 파일명.py

 

 

실제로 이 방법으로 330MB였던 프로그램을 45MB로 용량으로 줄였습니다.

 

하지만 pandas와 numpy를 사용했었다면 이 방법을 사용하지 못 했을거예요. 그래서 이 방법은 반쪽짜리 임시 해결책이라고 볼 수 있습니다.

 

3. 제대로 된 해결방안

 

위의 문제를 제대로 해결하기 위한 방법은 새로운 가상환경을 만들어서, 그 환경에서 pip install로 필요한 패키지를 설치한 다음, pyinstaller를 실행하는 것입니다.

 

가상환경을 만드는 방법은 아래에 정리해 두었으니 참고해주세요.

 

2021.12.07 - [파이썬 기초/개발환경 구축(VScode)] - [Python/VScode] 파이썬 가상환경 만들고 사용하는 법 상세정리

 

2021년 12월 10일 기준으로 예전과 조금 달라진 점이 있어서 공유드립니다.

 

2021년 5월 22일에 exe 파일을 만들었을 땐 190MB였던 파이썬 파일이 현재으로 다시 exe 파일로 만들어보니 87.3MB로 출력됩니다.

 

Anaconda (base) 가상환경

 

짧은 지식으로 추측해보건데, 현재 pyinstaller 버전(4.7)에서 그 동안 발생했던 용량 문제를 조금이나마 해결한 듯 합니다.

 

어쩌면 아래의 코드가 가장 가성비 좋은 해결방법일 수도 있겠다는 생각이 듭니다.

pip install --upgrade pyinstaller

 

위에서 조금이나마 해결했다고 하는 이유는 아래의 신규 생성한 가상환경에서 만든 exe 용량 때문입니다. 잘 보시면 약 70% 수준으로 감소한 것을 확인할 수 있습니다. 조금이라도 더 용량을 줄이고 싶으시다면 가상환경을 새로 만드시는 방법을 추천드립니다.

신규로 셋팅한 가상환경

 


오늘 준비한 내용은 여기까지입니다.

 

다음 시간에는 pyinstaller로 exe 파일 패키징 시, pyqt 혹은 selenium를 사용한 파이썬 파일이 ui 파일과 chromedriver의 경로를 못 찾는 문제와 이러한 리소스 파일을 함께 포함하여 패키징 하는 방법에 대해서 다루어 보겠습니다.

 

감사합니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 제가 번번히 도전하다가 실패했던, 코딩 초보에겐 너무나도 어려운 파이썬 가상환경을 셋팅하는 방법에 대해서 자세히 알아보겠습니다.

 

이 글이 많은 코린이 여러분에게 도움이 되길 바라면서 오늘 포스팅 시작하겠습니다.

 

참고로 제목에서도  보셨 듯이 개발환경은 VScode를 사용한 점 참고 바랍니다.


 

1. 인터프리터 선택의 의미 (Select Interpreter) 

 

우리는 처음에 파이썬을 설치하고 실행을 하면 인터프리터를 설정해줍니다.

 

쉽게 말해서 어떤 경로의 파이썬을 실행시켜줄지 선택하는 것입니다.

 

Anaconda 패키지로 파이썬을 설치하셨다면 아마 ~/opt/anaconda3/bin/python이라는 인터프리터를 기본적으로 사용하실거예요.

 

Anaconda와 순정 python의 environment

 

VScode에서 단축키 'Ctrl(or CMD) + Shift + P'를 입력하거나 좌측 하단의 빨간 상자 부분을 클릭하면 선택할 수 있답니다.

 

이 인터프리터를 선택한다는 것은 pip 혹은 conda 명령어로 설치한 모듈과 라이브러리들(bin과 lib에 위치)을 사용할 수 있다는 것을 의미합니다.

 

예를 들어, 아래에서 배울 가상환경을 새로 만들고 거기에 있는 python 인터프리터를 선택하면 원래 문제없던 import 부분의 코드들에 빨간줄이 쳐지는 것을 보실 수 있을거예요.

 

anaconda3 폴더 안의 폴더들

 

 

2. 가상환경 만들기

 

우리는 간단한 코드 한 줄로 위에서 본 anconda3 폴더 같은 가상환경을 생성해 줄 수 있습니다.

 

참고로, 잘쓰던 기본 개발환경을 놔두고 가상환경을 만드는 이유는 진행하는 프로젝트마다 패키지들의 버전에 따라 발생할 수 있는 호환성 문제를 방지해주기 위함입니다.

 

또한 anaconda 개발 환경과 pyinstaller 궁합이 맞지 않아서 용량이 엄청 커지는 문제를 피하기 위해서도 사용할 수 있답니다.

 

자 그럼 서론은 이쯤하고, 본론으로 들어가볼까요?

 

 

1) VScode로 프로젝트 폴더열기 & 터미널 창 열기

 

가상환경을 만드는 것은 아무 폴더에나 가능하지만 저는 VENV_BASIC이라고 폴더를 하나 만들고 VScode로 폴더를 열었습니다.

 

그리고는 화면 상단의 메뉴에서 터미널 - 새 터미널을 클릭해줍니다.

 

 

2) 터미널 창에 코드 입력

 

# 작업공간에 새로운 가상환경 만듦
python -m venv newvenv

 

터미널 창이 열렸으면 위의 코드를 아래와 같이 터미널 창에 입력해주세요. 참고로 newvenv는 제가 마음대로 지은 이름이므로 여러분들도 마음에 드시는 이름으로 지어주시면 됩니다.

 

 

가상환경을 설치하시면 newvenv라는 폴더가 생기고 하위 폴더로 bin, include, lib/python3.8/site-packages 폴더 3개가 생기는 것을 확인 하실 수 있습니다. (참고로 windows 환경에서는 bin 대신 Scripts로 폴더가 만들어집니다)

 

 

3) 가상환경의 인터프리터 선택

 

만들어진 가상환경을 사용하려면 처음에 설명드렸 듯이 인터프리터를 다시 선택해주어야 합니다.

 

 

새로 만든 가상환경을 선택했음에도 터미널 창을 보면 처음 그대로의 인터프리터를 사용하고 있습니다.

(여기서 pip install로 라이브러리들을 설치해봤자 이미 설치돼 있다는 말만 나옵니다.)

 

 

당황하지 마시고 오른쪽의 + 버튼을 눌러서 새로운 터미널 창을 열어주세요.

 

아래를 보시면 (newvenv)라고 표시되어 정상적으로 가상환경에 접속했음을 알 수 있습니다.

 

 

4) 새로운 가상환경에 라이브러리 설치하기

 

신나게 pip install 명령어를 이용해 필요한 라이브러리를 설치해주었습니다.

 

그런데 뭔가 설치는 됐다고 하는데 노란색 글씨로 경고를 해줍니다. 

 

 

자세히 읽어보면 pip 버전이 최신이 아니라서 업그레이드를 해주라고 합니다. 친절하게 어떻게 업그레이드 하는지도 알려주네요.

 

# pip install --upgrade pip만 입력해도 되는 것으로 확인

python -m pip install --upgrade pip

 

 

성공적으로 업그레이드 되었다고 합니다. 이젠 다른 라이브러리를 설치할 때에 경고를 띄우지 않습니다.

 

 


오늘 준비한 내용은 여기까지입니다.

 

다음 시간에는 예전에 애를 먹었던 pyinstaller 용량줄이기를 가상환경을 통해서 해결하는 것에 대해 다루어 보겠습니다.

 

오늘도 공부하시느라 고생 많으셨습니다!

 

이 글이 도움이 되셨다면, 아래의 광고를 한 번씩만 눌러주시면 너무너무 감사하겠습니다!

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 


 

오늘은 Pyqt5를 다루면서 항상 의문이었던 부분을 정리해보려 합니다.

 

바로 파이썬 Pyqt5 패키지로 GUI 창을 만들 때 사용되는 QWidget, QDialog, QMainWindow 클래스 3형제들입니다.

 

class MyWindow(QWidget):

    def __init__(self):
        super().__init__()

 

구글링하면 Pyqt5 관련 패키지의 코드들을 보면 QWidget이 들어간 자리에 이 3형제들이 골고루 들어가 있어서 혼란스러웠기에 저같은 분들이 있으실 듯 하여 정리해보는 시간을 갖기로 하였습니다.

 

참고로 제가 즐겨 사용하는 qt designer을 켜면 아래와 같이 3가지 클래스(Dialog, Main Window, Widget)를 선택하는 창이 가장 처음 출력됩니다.

 

 

1. QWidget

 

QWidget을 딱 한마디로 설명하면 버튼, input 위젯 같은 다양한 위젯들을 올려놓을 수 있는 사각형의 영역입니다.

 

즉, 그림을 그릴 수 있는 도화지 같은 것이죠.

 

특징으로는 Main Window와 다르게 상단의 메뉴창과 하단의 상태창을 추가할 수 없습니다.

 

qt designer에서의 창 형태

qt designer에서의 객체 및 클래스 분류

 

2. QMainWindow

 

위에서 잠시 보았던 QWidget과 비슷하지만 조금 다릅니다.

 

QMainWindow는 최상위 위젯으로 메뉴바, 도구 모음, 상태바등이 포함된 미리 정의된 레이아웃을 가지고 있습니다.

 

가장 기본적인 QMainWindow의 형태

 

qt designer의 객체 탐색기를 살펴보면 QMainWindow라는 상위 클래스에 QWidget이 속해 있는 것을 알 수 있죠.

 

즉, MainWindow를 도화지와 도화지를 담고 있는 프레임이라고 생각하시면 됩니다.

 

qt designer에서의 객체 및 클래스 분류

 

 

3. QDialog

 

항상 별도의 창에 표시되는 대화상자로, 주로 우리가 흔히 보는 팝업창이나 경고창 역할을 주로 합니다.

 

아래의 그림에서 보시면 기본 템플릿에서 버튼을 제공하는 것이 있는데, 주로 사용자가 간단히 확인, 취소 버튼을 누를 때 사용하기 때문입니다. 아직 테스트는 해보지 않았지만 버튼을 최대로 넣을 수 있는 제한 같은게 있다고 하네요.

 

 

겉보기에는 Qwidget과 별 다를 것이 없죠?

 

qt designer에서의 객체 및 클래스 분류

 

4. Modal, Modeless 개념 (참고)

 

위에서 배운 기본적인 GUI 창 3형제를 더 깊이 이해하려면 Modal 및 Modaless의 개념에 대해서 알아야 합니다.

 

두 개념은은 MainWindow를 제외한 Widget과 Dialog에서 사용하는 실행 형식입니다.

 

참고로 Dialog 창은 Modal 속성을 주로 사용한답니다.

 

 

1) Modal

 

- 새롭게 Modal 속성을 가진 창이 열렸을 경우 기존에 있던 창을 사용하지 못하는 '제어권 독점' 방식입니다.

  (이 특성을 이용해서 중요한 메세지를 표시하는 Dialog는 거의 Modal 창을 이용합니다.)

 

- exec()의 실행 형식으로 독립적입니다. (이 부분은 좀 더 공부 필요)

 

2) Modeless

 

- 어느 하나의 Dialog 창이 있어도 프로그램 제어권을 독점하지 않으므로 다른 작업이 가능합니다. (즉, 다른창을 선택 가능)

 

- show()의 실행 형식으로 독립적이지 않습니다. (이 부분은 좀 더 공부 필요)

 


<참고자료>

 

1. 개발자 라면_QWidget과 QDialog의 차이 - Modal/Modeless

https://flower0.tistory.com/457

 

 

2. 타스의 개발 블로그_[MFC] Modal&Modeless Dialog: 설명

https://tars-c.github.io/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/mfc/dialog/Dialog-Modal-and-Modeless-%EC%84%A4%EB%AA%85/

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

<Telegram 패키지 관련 지난 글>

 

2021.04.03 - [파이썬 패키지/텔레그램(Telegram)] - [Python / Telegram] 파이썬으로 Telegram bot 사용하는 법 (feat. 공시정보알림 탤레그램 봇 소개)

2021.12.05 - [파이썬 패키지/텔레그램(Telegram)] - [Python/Telegram] 파이썬으로 텔레그램 채널 관리 봇(bot) 사용하는 법_1편.채널 추가 및 관리자로 봇 추가(코딩 ㄴㄴ)


 

오늘은 지난 시간 생성한 채널에 봇을 이용해서 메시지를 보내는 방법을 포스팅 해보겠습니다.

 

 

1. 대화방의 chat_id 파악하기

 

지난 시간 텔레그램 봇을 생성하고, 채널도 생성하셨다면 이제 코딩을 할 시간입니다.

 

시작 전에 살포시 import를 해주겠습니다.

 

# 만약 설치가 안되어 있으면 터미널 창에 pip install python-telegram-bot 입력
import telegram

 

봇이 채팅을 할 수 있도록 하려면 2가지 정보가 필요합니다.

 

 

1) 봇의 토큰 정보

 

가장 기본적으로 필요한 봇 토큰과 토큰을 이용해서 봇을 불러오는 코드입니다.

#토큰을 변수에 저장 (대략 이렇게 생겼음: '0123456789:AABBCCDDGdv1mI8zOcd9d7d7q87q9qQ')
bot_token = '각자 생성한 봇의 고유 토큰 입렵(타인에게 노출하지 말 것)'

#telegram 패키지의 Bot 함수를 사용하여 내가 만든 bot 객체화
bot = telegram.Bot(token = bot_token)

 

만약 봇의 토큰 정보를 모르시는 분들은 텔래그램 관련 지난 글 중, 첫번째 글을 참고해주세요.

 

 

2) chat_id

 

오늘의 핵심은 chat_id의 개념입니다.

 

텔레그램의 대화방은 각각 고유한 chat_id를 가지고 있습니다.

우리가 봇을 이용해서 메시지를 보내기 위해서는 대화방의 chat_id를 알아야만 하죠.

 

chat_id를 알기 위해서는 일단 대화방에서 우리가 아무말이나 입력해서 전송해야합니다.

 

우선 여러분들이 만드신 봇(저의 경우엔 DART)의 대화방에 들어가셔서 아무말이나 입력해보세요.

 

그런 후에 아래의 코드를 실행합니다. (물론 위의 코드들이 선행되어야 합니다)

 

# bot과의 채팅 정보 및 메세지 업데이트
updates = bot.getUpdates()

# updates에 들어있는 내용 하나씩 꺼내어 출력
for i in updates :
    print(i)
    print('\n')

 

출력 결과는 이렇게 생겼습니다. 아주 길다란 딕셔너리 형태입니다. 

{'message': {'photo': [], 'chat': {'first_name': 'Sangwoo', 'type': 'private', 'id': 1516137537}, 'entities': [], 'channel_chat_created': False, 'new_chat_members': [], 'caption_entities': [], 'message_id': 255, 'new_chat_photo': [], 'delete_chat_photo': False, 'text': '여기는 봇과의 대화방', 'date': 1638625002, 'group_chat_created': False, 'supergroup_chat_created': False, 'from': {'first_name': 'Sangwoo', 'is_bot': False, 'language_code': 'ko', 'id': 1516137537}}, 'update_id': 899725563}

 

이걸 정리해서 보면 아래와 같은 구조를 갖고 있어요. 중요하게 볼 부분은 바로 chat 안의 id입니다.

저기 보이는 숫자가 제 봇 채팅방의 고유한 id인 것입니다. (단, 봇 토큰이 없으면 저 아이디를 알아도 채팅을 보낼 권한이 없답니다.)

 

참고로 type은 private, 즉 개인톡방입니다. 다음에 배울 채널 대화방은 channel이라고 나와요.

봇 채팅방의 chat_id

 

동일하게 여러분들이 지난 시간 만드신 채널에도 아무 채팅이나 전송한 후에 같은 코드를 실행하시면 아래와 같은 결과를 얻으실 수 있습니다.

채널 채팅방의 chat_id

 

2. 봇으로 메시지 보내기

 

여기까지 하셨으면 메시지를 보내는 방법은 너무나도 간단합니다.

 

# 위에서 파악한 코딩유치원 채널 id
chat_id = '-1001415675502'

#위에서 얻은 chat id로 bot이 메세지를 보냄.
bot.sendMessage(chat_id = chat_id, text="봇으로 보내는 메시지")

 

첫 메시지가 제가 직접 입력한 것이고, 두 번째 메시지가 위의 코드로 전송한 메시지 입니다. 

 

이렇게 봇으로 메시지를 보내는 방법을 이용하면 아래와 같은 프로젝트도 가능하답니다.

 

2021.04.05 - [파이썬 패키지/텔레그램(Telegram)] - [Python/Telegram] 원하는 주제의 네이버 뉴스 텔레그램으로 5분마다 전송 받기

 

[Python/Telegram] 원하는 주제의 네이버 뉴스 텔레그램으로 5분마다 전송 받기

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도

coding-kindergarten.tistory.com

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 


 

오늘은 텔레그램 채널을 생성하고 지난 시간에 생성했던 자신만의 텔레그램 봇을 관리자로 추가하는 방법과 그렇게 생성한 채널에 봇을 이용해서 글, 사진, 링크 등을 보내는 방법을 포스팅 해보겠습니다.

 

저의 경우엔 실시간으로 정보를 받는 것을 목적으로 했기에 스마트폰에 텔레그램 어플을 설치해서 사용했습니다.

(사용해보진 않았지만 컴카톡처럼 컴퓨터용 텔레그램 앱이 있다고 더라구요)

 

1. 채널 생성하는 법

 

1) 텔레그램 채널 목록창에서 우측 하단의 연필 모양의 버튼을 클릭합니다.

 

2) 클릭하시면 아래와 같은 화면이 나올텐데, 채널 만들기를 클릭해주세요.

    (연필 모양을 클릭했을 때, 연락처 동기화에 대한 팝업창이 뜨는데 저는 하지 않았습니다)

 

3) 채널명과 채널 설명을 원하시는데로 작성하시고 우측 상단의 체크모양을 클릭해주세요.

 

4) 다음으로는 채널 공개/비공개를 선택하는 단계입니다. 

     이 부분은 추후에도 변경가능하므로 일단 비공개를 선택 후, 우측 상단의 체크 버튼을 눌러주세요.

 

5) 구독차를 추가하는 단계이지만, 그런거 없으니깐 바로 우측 하단의 버튼을 누르시고 다음단계로 넘어가주세요.

 

6) 채널이 완성되었습니다.

 


2. 채널 관리자로 봇을 추가하는 법

 

1) 방금 전 생성된 채널의 채널명이 있는 부분을 클릭하면 설정창이 출력됩니다.

 

 

출력된 설정창에서 관리자 탭을 클릭해주세요.

 

2) 관리자 추가 탭을 클릭해주세요.

 

3) 우측 상단의 검색 버튼을 클릭해주세요.

각자 생성하셨던 봇의 이름을 검색해서 선택해주세요.

(저는 DART 공시정보 프로젝트를 하던 중에 생성했던지라 이름이 DART입니다)

 

4) 관리자 권한 설정부분이 있으나, 어차피 제가 조정하는 봇이니 그냥 쿨하게 전권을 주고 우측상단의 체크버튼을 클릭해줍니다.

 

5) 여기까지 완료하셨으면 여러분들이 만드신 봇이 채널의 관리자가 된 것을 확인하실 수 있답니다.

 


사진으로 인해서 너무 글이 길어질 듯하여 2편에서 파이썬으로 방금 생성한 채널을 다루는 방법을 포스팅 하겠습니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 제가 국세청홈택스 페이지 관련 웹크롤링 프로젝트를 진행하다가 겪은 문제를 정리해보려합니다.

 

참고로 저의 경우엔 웹크롤링을 할 때엔 한줄씩 실행결과를 확인하기 위해서 Jupyter Notebook을 사용합니다.

(VScode 위에서 주피터 노트북(.ipynb)을 실행하여도 무방)

 


 

제가 진행했던 순서대로 코드와 함께 정리해보겠습니다.

 

# step1. 관련 패키지 및 모듈 불러오기
from selenium import webdriver
import time

# step2.크롬 드라이버 실행 및 driver라는 변수명으로 객체화 (괄호 안에는 각자의 크롬드라이버 경로를 입력하면 됨)
driver = webdriver.Chrome('./chromedriver')

# step3.(크롬)드라이버가 요소를 찾는데에 최대 5초까지 기다림
driver.implicitly_wait(5)

# step4.국세청홈택스 url 주소를 가져와서 접속
driver.get('https://www.hometax.go.kr/websquare/websquare.html?w2xPath=/ui/pp/index.xml')
time.sleep(1)

 

여기까지는 기본적인 코드이므로 그냥 설명 없이 진행하겠습니다. 코드 실행 시, 아래의 화면까지 실행됩니다.

 

 

다음 단계는 화면 상단 중앙에 위치하는 로그인 버튼을 누르는 단계입니다.

 

이 단계도 별문제 없이 실행됩니다. 저는 주로 find_element_by_xpat( ) 함수를 즐겨 사용합니다.

무지성으로 copy해와서 붙여넣으면 편하거든요ㅎㅎ.

 

# 로그인 단계로 가기위해서 화면상단의 로그인 탭 클릭
driver.find_element_by_xpath('//*[@id="textbox81212912"]').click()
time.sleep(1)

 

로그인 탭 click이 정상적으로 실행되었으면 아래와 같은 화면이 출력됩니다.

 

제가 할 프로젝트는 공동인증서로 로그인해야하므로 아래의 파란색버튼('공동.금융인증서)을 눌러주어야 합니다.

 

 

F12를 눌러서 이 버튼을 클릭하려면 어떤 태그를 참조해야하는지 봅시다.

 

오른쪽 개발자도구에서 빨간색 사각형으로 표시한 a태그의 id가 'anchor22'인 html을 참조해야합니다.

 

저는 해당 태그를 '우클릭'해서 xpath를 copy한 후, find_element_by_xpath( )에 붙여넣어줬습니다.

 

 

driver.find_element_by_xpath('//*[@id="anchor22"]').click()

 

자, 이 코드를 실행하면 드디어 오늘 글의 이유인 불량이 출력됩니다.

 

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="anchor22"]"} (Session info: chrome=96.0.4664.55)

 

분명 눈앞에 있는 버튼인데 못 찾겠답니다. 저같은 초보에게는 이런 경우가 웹크롤링 할 때 제일 막막한 경우죠.

 

예전부터 저를 가끔씩 괴롭히던 원인은 바로 iframe이라는 개념입니다.

 

iframe 요소란?

 

iframe이란 inline frame의 약자로 쉽게 말해 페이지 안의 페이지입니다.

 

위에서 오류가 났던 이유는 iframe 페이지 안의 요소는 selenium이 참조하지 못 하기 때문이죠!

 

아래의 그림을 보시면 큰 빨간색 사각형으로 표시한 부분이 iframe 영역입니다.

 

해당 영역을 확인해보시려면 방금 전 찾았던 공동.금융인증서의 html을 개발자도구로 찍으시고, 위로 쭉 따라 올라가보시면 오른쪽 빨간색 사각형으로 표시해놓은 iframe 태그가 존재합니다. 여기에 마우스를 올리시면 영역이 파랗게 표시된답니다.

 

 

iframe 전환하는 법

 

우리가  원하는 공동.금융인증서 버튼을 클릭하려면 해당 iframe으로 들어가야합니다.

 

방법은 매우 간단합니다. 아래의 코드와 같이 들어가고 싶은 iframe의 id를 괄호 안에 넣어주면 됩니다.

driver.switch_to.frame('txppIframe')
time.sleep(1)

 

코드를 실행하셔도 눈에 보기에는 아무 변화가 없습니다. 그래서 전환 되었는지 확인하려면 아까 실패했던 코드를 다시 실행해서 버튼을 눌러보아야 합니다.

 

driver.find_element_by_xpath('//*[@id="anchor22"]').click()

 

아래와 같이 인증서 선택창이 정상적으로 출력되었습니다. 이 다음 단계는 다음 포스팅에서 다루어 보도록 하겠습니다.

 

 

다시 상위 frame으로 전환하는 법

 

만약 다시 상위 프레임으로 전환하고 싶다면 아래의 코드를 실행해보세요.

 

driver.switch_to.parent_frame()

 

default_content도 가능하다고 하는데 저는 일단 parent_frame( )으로 충분할 듯 합니다.

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

 

[웹 크롤링 기초]

2021.03.22 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 기초 of 기초

2021.03.23 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 크롬드라이버 크롬 버전에 맞춰서 설치하는법

2021.03.24 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 관련 패키지 3종 총정리

2021.03.27 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링을 위한 속성 HTML, CSS 요약 정리

2021.03.28 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 동적/정적 페이지 차이와 그에 따른 크롤링 방법 간단정리

 

[정적 웹크롤링]

2021.03.30 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링 정적 수집 방법 개념 정리_find, find_all, select, select_one

2021.04.02 - [파이썬 패키지/웹 크롤링] - [Python/Requests/Beautifulsoup] 네이버 뉴스 기사 제목 크롤링을 통한 정적 수집 기초 정리

2021.04.06 - [파이썬 패키지/웹 크롤링] - [Python/Reuqests/Beautifulsoup] 파이썬 정적 웹크롤링 텍스트, 이미지, 하이퍼링크, 속성 가져오는 법

 

[동적 웹크롤링]

2021.04.03 - [분류 전체보기] - [코딩유치원] 네이버 뉴스 기사 제목 크롤링을 통한 동적 수집 기초 정리(selenium, beautifulsoup)

2021.06.21 - [파이썬 패키지/웹 크롤링] - [Python/Selenium] 파이썬 동적 웹크롤링 텍스트, 하이퍼링크, 이미지, 속성 가져오는 법

2021.05.22 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] 잡플래닛 리뷰 정보 크롤링 GUI 프로그램

 


오늘은 Selenium으로 원하는 네이버 뉴스 기사의 댓글 정보(아이디, 작성시간, 댓글 내용)를 크롤링하고 엑셀로 저장하는 것을 해보겠습니다.

 

참고로 이번 포스팅은 '반원의 코딩 랜드'라는 유튜브 채널의 웹크롤링 강의를 참고하였습니다.

 

친절하게 잘 설명해주셔서 많은 공부가 되었습니다. 총 4편까지 있고 그리 길지 않으니 관심있으신 분들은 보시는 것을 추천드립니다.

 

<강의 링크>

https://www.youtube.com/watch?v=lK__oNsOGOY&list=PL5L3Lhdx2zrNu2PuVUyb-4UdheDcUN3K7&index=5 

 

 

1. 전체 코드

 

이해하기 쉽도록 자세하게 주석을 달아두었으니 어렵지 않을거예요.

 

# step1. 관련 패키지 및 모듈 불러오기
from selenium import webdriver
import time
import pandas as pd


# step2. 네이버 뉴스 댓글정보 수집 함수
def get_naver_news_comments(url, wait_time=5, delay_time=0.1):
    
    # 크롬 드라이버로 해당 url에 접속
    driver = webdriver.Chrome('./chromedriver')
    
    # (크롬)드라이버가 요소를 찾는데에 최대 wait_time 초까지 기다림 (함수 사용 시 설정 가능하며 기본값은 5초)
    driver.implicitly_wait(wait_time)
    
    # 인자로 입력받은 url 주소를 가져와서 접속
    driver.get(url)

    # 더보기가 안뜰 때 까지 계속 클릭 (모든 댓글의 html을 얻기 위함)
    while True:
        
        # 예외처리 구문 - 더보기 광클하다가 없어서 에러 뜨면 while문을 나감(break)
        try:
            more = driver.find_element_by_css_selector('a.u_cbox_btn_more')
            more.click()
            time.sleep(delay_time)
            
        except:
            break

    # 본격적인 크롤링 타임
    
    # 1)작성자
    # selenium으로 작성자 포함된 태그 모두 수집
    nicknames = driver.find_elements_by_css_selector('span.u_cbox_nick')
    # 리스트에 텍스트만 담기 (리스트 컴프리핸션 문법)
    list_nicknames = [nick.text for nick in nicknames]

    # 2)댓글 시간
    # selenium으로 댓글 시간 포함된 태그 모두 수집
    datetimes = driver.find_elements_by_css_selector('span.u_cbox_date')
    # 리스트에 텍스트만 담기 (리스트 컴프리핸션 문법)
    list_datetimes = [datetime.text for datetime in datetimes]

    # 3)댓글 내용
    # selenium으로 댓글내용 포함된 태그 모두 수집
    contents = driver.find_elements_by_css_selector('span.u_cbox_contents')
    # 리스트에 텍스트만 담기 (리스트 컴프리핸션 문법)
    list_contents = [content.text for content in contents]


    # 4)작성자, 댓글 시간, 내용을 셋트로 취합
    list_sum = list(zip(list_nicknames,list_datetimes,list_contents))

    # 드라이버 종료
    driver.quit()
    
    # 함수를 종료하며 list_sum을 결과물로 제출
    return list_sum

# step3. 실제 함수 실행 및 엑셀로 저장
if __name__ == '__main__': # 설명하자면 매우 길어져서 그냥 이렇게 사용하는 것을 권장
    
    # 원하는 기사 url 입력
    url = '댓글 크롤링 원하는 기사의 url (주의! 댓글보기를 클릭한 상태의 url이어야 함'
    
    # 함수 실행
    comments = get_naver_news_comments(url)
    
    # 엑셀의 첫줄에 들어갈 컬럼명
    col = ['작성자','시간','내용']
    
    # pandas 데이터 프레임 형태로 가공
    df = pd.DataFrame(comments, columns=col)
    
    # 데이터 프레임을 엑셀로 저장 (파일명은 'news.xlsx', 시트명은 '뉴스 기사 제목')
    df.to_excel('news.xlsx', sheet_name='뉴스 기사 제목')

 

 

2. 주의할 점

 

1) 그냥 기사의 url이 아니라 아래의 빨간 사각형으로 표시한 '댓글보기 버튼'을 클릭한 후의 url이어야 합니다.

 

2) 너무 댓글이 많은 경우엔 시간이 엄청 많이 걸릴 수 있음에 주의

 

참고한 강의에서는 8000개의 댓글을 40분동안 크롤링 했으며, 이 경우에는 beautifulsoup 패키지를 활용해야 합니다.

제가 예전에 작성했던 글에 selenium만으로도 충분하다고 했었는데 그렇지 않다라는 것을 알았습니다.

(제가 작은 양의 크롤링만 해왔던 것 같아요ㅎㅎ..)

 

결론적으로 최종코드에서 '# 본격적인 크롤링 타임' 아래 부분을 아래의 코드로 바꾸어주는 것이 더욱 효율적인 코드라고 할 수 있겠습니다.

# 본격적인 크롤링 타임

html = driver.page_source
# print(html)

# 모듈 참조
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml') #html.parser

# 1)작성자
nicknames = soup.select('span.u_cbox_nick')
list_nicknames = [nickname.text for nickname in nicknames]

# 2)댓글 시간
datetimes = soup.select('span.u_cbox_date')
list_datetimes = [datetime.text for datetime in datetimes]

# 3)댓글 내용
contents = soup.select('span.u_cbox_contents')
list_contents = [content.text for content in contents]

 

 

3.  새롭게 공부한  점

 

driver.implicitly_wait( )와 time.sleep( )의 차이점

 

예를 들어 implicitly_wait(5)은 크롬드라이버가 driver의 요소를 찾는데에 최대한 기다려줄 수 있는 시간을 의미합니다.

여기서 중요한 점은 기다리다가 실행이 되면 지체없이 다음 단계로 넘어가는 것과, 딱 한 번만 선언해주면 된다는 것입니다.

 

만약 5초가 지났는데도 창이 뜨지 않으면 에러를 출력합니다.

 

그리고 time.sleep( )은 아마 많이보셨을텐데 말그대로 sleep(0.1)은 0.1초동안 프로그램이 잠을 잔다는 의미입니다.

 

위의 코드에서 more.click( ) 명령 후에 time.sleep( )을 적당히 주지 않으면 드라이버가 '더보기'가 없다고 판단하고 while문을 예상보다 일찍 빠져나가버리기도 한답니다.

 

<참고 자료>

 

https://stackoverflow.com/questions/53588966/python-selenium-difference-between-driver-implicitly-wait-and-time-sleep

 

Python & Selenium: Difference between driver.implicitly_wait() and time.sleep()

Yes, I know both are used to wait for some specified time. Selenium: driver.implicitly_wait(10) Python: import time time.sleep(10) Is there any difference between these two?

stackoverflow.com

 


 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.


오늘은 어제 오늘 도전해봤던 코스피, 코스닥 상장기업 영업이익 성장세로 필터링 해보기 프로젝트를 중간 정리하는 시간을 가져보겠습니다.

모두 완료하고 포스팅을 해보려 했으나, 부족한 실력으로 인해서 시간이 조금 더 걸릴 듯해서 중간 정리 글을 써보려 합니다.

1. 프로젝트에 사용된 패키지


우선 사용한 패키지는 예전에 소개드렸던 dart-fss 패키지입니다.

<DART-FSS 관련 지난 글>

2021.06.10 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 1편_ DART API와 DART-FSS 패키지 소개
2021.06.22 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 2편_ 상장된 회사 재무제표 EXCEL로 저장하기
2021.06.25 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 3편_특정회사 혹은 특정 공시유형 가져오기
2021.06.27 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 4편_재무제표 4종 골라서 DataFrame으로 추출하기(ft. 재무상태표, 손익계산서, 포괄손익계산서, 현금흐름표)
2021.06.27 - [파이썬 패키지/전자공시시스템(DART)] - [Python/Dart] 파이썬으로 공시 정보 가져오기 5편_dart-fss 재무제표 다운로드 안될 때 해결법
2021.06.30 - [파이썬 패키지/주식투자] - [Python/Dart] 파이썬으로 공시 정보 가져오기 6편_XBRL 데이터 추출(ft. 제무재표, 감사 정보, 작성자 정보, 공시문서 정보 등등)


공부하면서 느꼈지만 해당 패키지는 하나의 목적을 이루기 위한 방법이 여러 루트가 있어서 조금 정리를 할 필요가 있다고 느꼈습니다.

2. 프로젝트의 목적


프로젝트의 목적은 다음과 같습니다.

주식 시장에 상장된 모든 기업들을 살펴보기엔 시간은 한정적입니다. 그래서 원하는 재무상태나 매출/영업이익의 증가세를 가진 기업들을 공시정보를 토대로 필터링하여 엑셀로 저장하고, 이 정보를 투자 판단에 활용하는 것이 프로젝트의 목적입니다.

참고로, 이번 프로젝트에서는 dart-fss 패키지만으로도 충분하지만, 추후에 회사의 현금 및 환금성 높은 자본과 현재의 시가총액을 비교하는 프로젝트를 해볼 때에는 FinanceDataReader 패키지도 함께 다루어 볼 예정입니다.

일단 이번 프로젝트는 모든 코스피 상장 기업의 가장 최근 사업보고서(연간)를 가져와서 3년간 영업이익을 비교하고, 3년간 계속 상승했다면 해당 기업의 이름을 저장하는 것을 목표로 할 것입니다.


3. 프로젝트의 컨셉 및 장애요소


프로젝트의 큰 그림을 그려보겠습니다. 대략적인 컨셉이며 추후에 조금 변경될 수도 있습니다.

1) 상장회사 리스트 불러오기

# DART 에 공시된 회사 리스트 불러오기 corp_list = dart.get_corp_list()


2) 코스피 상장사의 회사코드와 회사명 각각 리스트에 저장

# 전체 상장기업 리스트 중 코스피만 골라서 담기 kospi_list = corp_list.find_by_sector(sector='', market='Y')

여기서 kospi_list는 821개의 요소를 가지는데, 네이버 증권에서 코스피 탭을 들어가보면 1730개가 뜸.
(이건 정확히 무슨 차이인지 확인해볼 필요가 있음)

<네이버 증권_코스피 종목>
https://m.stock.naver.com/index.html#/domestic/capitalization/KOSPI

3) for문으로 회사코드를 모두 참조하며, xbrl 다운로드
- 기업이 아닌 펀드 종목의 경우엔 xbrl이 없으므로 예외처리(try, except)
- ex. 한국ANKOR유전, 베트남개발1 등등

4) 다운받은 xbrl에서 연결/개별 재무제표 여부 판단
- xbrl.exist_consolidated( )로 True/False 리턴 받아서 if/else문
- 쉽게 요약하면, 자회사가 있으면 연결 재무제표, 없으면 개별 재무제표

5) 연결/개별에 따라서 손익계산서를 데이터 프레임 형태로 가져오기
- 연결 재무제표라고 받아서, 손익계산서를 보면 연결/개별이 열을 번갈아가면서 함께 표현되어있음

연결 재무제표 모습

- 개별 재무제표는 당연히 연결에 대한 내용은 없음
- 참고로 손익계산서(is)와 포괄손익계산서(cis) 두 가지 개념이 있음 (is는 없고 cis만 있는 경우가 있음)
- 일반적으로 손익계산서는 매출(수익)에서 비용을 뺀 당기순이익까지를 나타내며, 기타포괄손익(미실현손익) 등을 포함한 손익계산서를 포괄손익계산서(국제회계기준, K-IFRS)라고 함

일단, 3, 4, 5번 컨셉을 지금까지 함수로 구현한 것은 아래와 같음 (추후 보완 예정)

def search_annual_report(corp_code, bgn_de): data_company = corp_list.find_by_corp_code(corp_code) try: # 사업보고서 검색 reports = data_company.search_filings(bgn_de= bgn_de, pblntf_detail_ty='a001') # 첫번째 리포트 선택 report = reports[0] # 리포트의 xbrl 데이터 받아오기 xbrl = report.xbrl # 연결/개별 재무제표 여부 판단 (True/False) boolean = xbrl.exist_consolidated() if boolean == True: print('연결 재무제표') # 0에는 전체, 1에는 당기순이익부터 계산한 손익계산서가 들어있음 income_statement = xbrl.get_income_statement()[0] df = income_statement.to_DataFrame(show_concept=False, show_class=False) print(df.info) else: print('개별 재무제표') # 여기서는 True가 개별 손익계산서임에 주의 income_statement = xbrl.get_income_statement(separate=True)[0] df = income_statement.to_DataFrame(show_concept=False, show_class=False) print(df.info) return(boolean, df) except: print(data_company.corp_name + ':' + 'xbrl 없음(상품, 펀드)') return(False, False)


6) 데이터 프레임에서 원하는 정보 추출 (영업이익)
- 기업마다 양식이 통일 되지 않아서, 규칙을 잡기가 쉽지 않음 (해결해야하는 문제)
- 재무제표의 column index가 멀티 index로 되어 있음 (해결해야하는 문제)

7) 추출한 정보로 원하는 규칙을 적용하여 기업을 필터링

8) 나중에 더 나아가면 FinanceDataReader를 이용해 과거 주가를 토대로 백테스트를 할 수도 있음


이번 글은 스스로 정리하는 시간을 갖기 위해서 작성했으며, 빠른 시일 내로 해당 프로젝트를 완성하도록 하겠습니다.

관심있으신 분들은 또 들려주세요.

감사합니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 파이썬의 장점인 간략한 코딩을 더욱 극대화하는 리스트 컴프리헨션에 대해서 공부해보겠습니다.


 

1. 리스트 컴프리헨션이란?

 

먼저 리스트 컴프리헨션(List Comprehension)의 의미를 알아봅시다.

 

리스트 컴프리헨션이란 '리스트 안에 표현식(계산식)과 for문, if문을 한줄에 넣어서 새로운 리스트를 만드는 것'을 말합니다.

 

# 일반적인 리스트 컴프리헨션

표현식(변수명이 포함되어 있음) for 변수명 in 기존 리스트

# if가 추가되어 필터링이 추가된 리스트 컴프리헨션

표현식(변수명이 포함되어 있음) for 변수명 in 기존 리스트 if 조건문

 

여기서 리스트라는 말이 들어가서 리스트만 사용할 수 있을 것 같지만, 앞서 배웠던 리스트(list), 튜플(tuple), 딕셔너리(dictionary), 셋트(set) 등의 컨테이너들도 모두 사용가능하답니다.

 

또한 표현식엔 수식 뿐만 아니라 함수도 사용 가능한 점도 알고 계시면 훨씬 더 간단한 코딩이 가능하답니다.

 

2. 리스트 컴프리헨션 사용법

 

간단한 예시를 통해서 리스트 컴프리헨션과 친해져 봅시다.

 

아래와 같은 리스트가 있습니다.

my_list = [0, 1, 2, 3]

 

이렇게 선언한 리스트 혹은 웹 크롤링을 통해서 받은 요소가 엄청 많은 리스트에 하나하나 어떤 처리를 하고 싶을 땐, 보통 이렇게 코딩을 하곤합니다.

 

# step1.처리(계산) 결과를 담을 새로운 리스트 선언
new_list = []

# step2.for문을 이용해서 계산을 수행하고, append()함수로 결과값을 새로운 리스트에 붙여넣기
for i in my_list:
    
    new_list.append(10*i)

 

결과를 확인해보면 아래와 같죠.

print(new_list)

>>> [0, 10, 20, 30]

 

리스트 컴프리헨션을 적용하면 단 한줄로 같은 결과를 낼 수 있답니다.

 

기존 코드와 비교하시면서 어떻게 3줄의 코드가 1줄의 코드로 바뀌었는지 꼭 이해하고 넘어가주세요.

 

new_list = [10*i for i in my_list]

 

 

3. 리스트 컴프리헨션(필터링) 사용법

 

 

앞서 언급하였 듯이 리스트 컴프리헨션에는 if문도 적용 가능합니다.

 

if문은 물론 if-else문도 사용 가능하답니다.

 

여기서 주의하실 점은 if문은 for문의 오른쪽, if-else문은 for문의 왼쪽에 사용한다는 점입니다.

 

<if문 사용 리스트 컴프리헨션 예시>

a = [1,2,3,4,5,6,7,8,9,10]

b = [i for i in a if i%2==0]

# if 조건을 and/or로 두 개 이상 쓸 수 있음
c = [i for i in a if i%2==0 and i%3==0]


print(b)
>>> [2, 4, 6, 8, 10]

print(c)
>>> [6]

 

<if-else문 사용 리스트 컴프리헨션 예시>

a = [1,2,3,4,5,6,7,8,9,10]

b = [i if i%2==0 else '홀수' for i in a ]

print(b)
>>> ['홀수', 2, '홀수', 4, '홀수', 6, '홀수', 8, '홀수', 10]

 

<if-else문 응용_ elif문 구현>

 

이해를 돕기 위한 if, elif, else 구문

if 짝수면 숫자를 출력

elif 짝수 아닌 것들 중, i가 10 이상이면 "홀수 중, 10 이상"이라는 문자열을 출력 (10은 10 이상이지만 짝수이므로 적용 안됨 --> elif)

else 그 외엔 모두 '홀수' 출력
 
a=[1,2,3,4,5,6,7,8,9,10,11]

b = [i if i%2==0 else '홀수' if i<10 else '홀수 중에 10 이상' for i in a ]

print(b)
>>> ['홀수', 2, '홀수', 4, '홀수', 6, '홀수', 8, '홀수', 10, '홀수 중에 10 이상']

 

오늘 준비한 내용은 여기까지입니다.

 

오늘도 공부하시느라 고생 많으셨습니다.


이 글이 도움이 되셨다면, 아래의 광고를 한 번씩만 눌러주시면 너무너무 감사하겠습니다!

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 내가 만들어 놓은 파이썬의 원하는 함수들을 원하는 주기 (초, 분, 시간, 요일, 특정 시각)마다 실행시켜주는 방법에 대해서 공부해 보겠습니다.

 


 

시작하기에 앞서, 오늘은 VS Code에서 파이썬 파일(.py)를 개발환경으로 사용하는 점 참고바랍니다.

 

schedule 패키지를 쥬피터 노트북(.ipynb)으로 다루니 프로그램이 종료되지 않고 계속 함수를 실행하는 문제가 있더라구요.

 

1. schedule 설치

 

우리가 오늘 배워볼 패키지는 앞서 언급했 듯이 schedule 입니다. 자세한 설명 없이 바로 설치하고 코드로 보여드리겠습니다.

 

터미널 창에 아래의 코드를 입력하시고 엔터를 누르시면 설치가 완료됩니다.

pip install schedule

설치 완료 시 출력되는 문구

 

2. schedule & time 모듈 불러오기

 

schedule 패키지는 파이썬 내장 라이브러리에 포함되어 있는 time 모듈과 함께 사용됩니다.

 

import schedule
import time

 

3. schedule 패키지 주기 설정법

 

잠시 schedule 패키지로 다양한 주기를 설정하는 방법을 살펴보겠습니다.

 

1) 시, 분, 초 단위로 실행

 

# 5초에 한번씩 함수 실행
schedule.every(5).seconds.do(함수)

# 10분에 한번씩 함수 실행
schedule.every(10).minutes.do(함수)

# 2시간에 한번씩 함수 실행
schedule.every(2).hour.do(함수)

 

2) 일, 주 단위로 실행

 

# 3일에 한번씩 함수 실행
schedule.every(3).days.do(함수)

# 2주에 한번씩 함수 실행
schedule.every(2).weeks.do(함수)

 

3) 매일 정해진 시각에 실행

 

위에서 언급한 시, 분, 초, 일, 주 단위와 조합하여 더 디테일하게 주기를 설정할 수도 있습니다.

# 매일 13시 30분에 함수 실행
schedule.every().day.at("13:30").do(함수)

# 매일 "11:11:11"에 함수 실행
schedule.every().day.at("11:11:11").do(함수)

 

4) 매주 정해진 요일의 특정 시각에 실행

 

요일도 설정 가능합니다. 모두 소문자로 입력하는 점 주의해주세요.

(monday, tuesday, wednesday, thursday, friday, saturday, sunday)

# 매주 월요일 13시 30분에 함수 실행
schedule.every().monday.at("13:30").do(함수)

 

4. schedule 패키지 실행

 

실행 방법은 아주 간단합니다. 이 부분은 전체적인 코드로 보여드리겠습니다.

 

가장 step4의 무한루프 코드를 넣어주지 않으면 파이썬 파일이 종료되면서 바로 스케쥴링도 작동하지 않습니다.

 

# step1.관련 패키지 및 모듈 import
import schedule
import time

# step2.실행할 함수 선언
def message():
    print("스케쥴 실행중...")

# step3.실행 주기 설정
schedule.every(1).seconds.do(message1)
    
# step4.스캐쥴 시작
while True:
    schedule.run_pending()
    time.sleep(1)

 

<실행 결과>

 

5. 인자를 받는 함수 사용법

 

위에서는 아주 단순한 print 함수를 사용한 함수를 사용해서 문제 없었지만, 우리는 분명 인자를 받는 함수를 사용할 일이 있습니다.

 

이럴 때는 기본적인 함수가 인자를 받는 방법과 다르니 알아두시면 도움이 되실거예요.

 

# text라는 파라미터가 존재하여, 실제 사용 시엔 인자를 받아야함

def message2(text):
    print(text)
    
# 사용방법
schedule.every(2).seconds.do(message2,'2초마다 알려줄게요')

 

보시다시피 message2(인자)가 아닌 점에 주의해주세요. 작동하는 것은 아래에서 보여드리겠습니다.

 

 

6. schedule 중지하는 법

 

제가 아는한 schedule을 중지하는 법은 크게 3가지 입니다.

 

1. while문에 조건을 걸어서 무한루프를 종료시키고 파이썬 파일을 종료한다.

 

2. sys 모듈의 exit( ) 함수로 파이썬 파일을 강제 종료

 

3. schedule 패키지의 cancel_job( ) 함수 사용

 

제가 이번 시간에 알려드릴 방법은 세번째 방법인 cancel_job( ) 함수입니다.

추가적인 모듈을 import할 필요도 없고, 주기 설정한 함수 별로 종료할 수 있기 때문입니다.

 

코드는 아래와 같습니다.

 

여기서 주목할 점은 설정한 주기를 변수(job1, job2)에 넣어주었고, 이 job들을 cancel_job( )의 인자로 넣어 준다는 것입니다.

 

바로 실행 시켜보겠습니다.

import schedule
import time

def message1():
    print("스케쥴 실행중...")

def message2(text):
    print(text)

# 주기 설정
job1 = schedule.every(1).seconds.do(message1)
job2 = schedule.every(2).seconds.do(message2,'2초마다 알려줄게요')


count = 0

while True:
    
    schedule.run_pending()
    time.sleep(1)
    
    count = count + 1
    
    if count > 5:
        schedule.cancel_job(job1)

 

<출력 결과>

 

어떻게 작동하는지 이해되셨나요?

 

이정도만 아셔도 앞으로 원하시는 스케쥴 기능을 구현하시는데에 문제 없을 것이라 생각합니다.

 

여러분들의 코딩에 많은 도움이 되었길 바라며, 오늘 포스팅은 여기서 마치겠습니다.

 

오늘도 공부하시느라 고생 많으셨습니다~~!


<참고 자료>

 

https://schedule.readthedocs.io/en/stable/examples.html

 

Examples — schedule 1.1.0 documentation

Examples Eager to get started? This page gives a good introduction to Schedule. It assumes you already have Schedule installed. If you do not, head over to Installation. Run a job every x minute import schedule import time def job(): print("I'm working..."

schedule.readthedocs.io

 

이 글이 도움이 되셨다면, 아래의 광고를 한 번씩만 눌러주시면 너무너무 감사하겠습니다!

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원을 운영하고 있는 손생입니다.

 

저는 기계공학부를 나와서 현재 기구 설계 관련한 일을 한지 5년차가 되는 직장인입니다.

 

독학으로 파이썬과 데이터 분석, 머신러닝, 딥러닝 공부를 하다보니 대학원까지 관심을 갖게 되어, 회사를 다니면서 다닐 수 있는 대학원 중에서 가장 매력적이라고 생각 했던 성균관대 데이터사이언스융합학과를 지원했습니다.

 

아래는 직장인 대학원을 알아보면서 정리했던 글이니, 관심있으신 분들께서는 참고하시면 좋겠습니다.

 

2021.08.09 - [유용한 팁] - [빅데이터 대학원] 성균관대 데이터사이언스융합학과(직장인/야간) 정보 정리

 

[빅데이터 대학원] 성균관대 데이터사이언스융합학과(직장인/야간) 정보 정리

안녕하세요, 왕초보 코린이를 위한 코딩유치원을 운영하고 있는 손생입니다. 저는 기계공학부를 나와서 현재 기구 설계 관련한 일을 한지 5년차가 되는 직장인입니다. 독학으로 파이썬을 공부

coding-kindergarten.tistory.com

 

 

검색만 하면 구할 수 있는 정보는 과감히 제외하고, 참고하면 도움되실만한 정보만 정리해보겠습니다.

 

1. 경쟁률

 

저는 2022년 전반기 입학을 지원했으며, 연간 정원은 60명이니 우선 뽑는 인원은 대략 30명입니다.

(단, 대학원 입시설명회에서 훌륭하신분들이 많으면 더뽑을 수도 있다고 하였습니다)

 

제가 면접자 명단을 받았을 때, 지원자가 230명이었으니, 갱쟁률은 약 8대 1정도였습니다.

 

아래의 2021년 전반기 면접 후기를 보면 160명 정도가 지원했었으니, 해당 학과의 경쟁률은 갈수록 높아질 듯 합니다.

 

https://scikitlearn.tistory.com/103

 

성균관대학원 데이터사이언스융합학과 면접 후기 - 대학원 면접

안녕하세요 ㅎㅎ 오늘은 성균관대학원 데이터사이언스융합학과 면접 후기에 대해 작성하려고 합니다. 지난 10월 24일 성균관대학원 면접이 있었습니다. 필자도 지원하여 면접에 참석하였고 본

scikitlearn.tistory.com

 

2. 면접 후기

 

230명을 4개 조로 나누어 단 하루만에 다 보다보니, 한 명당 5분씩 면접을 보았습니다. 참고로 올해는 코로나로 인하여 줌, 웨비나를 이용해서 화상면접으로 진행하였습니다.

 

저는 학과장이신 이지형 교수님과 대학원생으로 보이는 젊은분께서 면접을 보았고, 너무 짧았던 시간만큼 몇 가지 물어보시진 않았습니다.

 

1) 자기소개

2) 딥러닝 스터디를 하고 있다고 어필하였고, 가장 최근 다룬 내용을 물어보셨음

3) 현재 하고 있는 일 그리고 데이터 분석과 연관성

4) 수행해본 프로젝트

 

저의 경우엔 데이터 분석과는 전혀 다른 업무를 하고 있어서, 지금까지 스스로 공부해왔던 파이썬 코딩, 데이터 분석 관련 라이브러리, 머신러닝, 딥러닝등의 지식과 블로그 운영한 것들을 어필하였으나 그것만으로는 부족했던 것 같습니다.

 

아마도 학과가 데이터 사이언스 관련 재직자를 위한 과이니 만큼, 현업에서의 필요성과 지금까지 해왔던 프로젝트과 그것에서 느낀점 등이 필요하지 않았을까하는 추측을 해봅니다.

 

 

3. 이번 탈락을 통해 느낀점

 

프로젝트를 하면서 포트폴리오를 만들어 가는 것이 중요하다고 생각했습니다. 단순히 무엇을 공부해봤다가 아니라 말이죠.

(여기서 말하는 포트폴리오는 수행한 프로젝트들을 잘 정리해놓은 문서 혹은 리스트를 뜻함)

 

그리고 이건 대학원 진학 뿐만 아니라 취업, 혹은 이직 시에도 마찬가지인 것 같습니다.

 

신입 사원으로 취업 할 때야 대다수가 포트폴리오가 없기 때문에 스펙(학점, 영어성적 등)과 가능성을 많이 보겠지만,

점점 경력이 쌓여갈 수록 고용주나 고객들에게 내가 지금 당장 무엇을 제공할 수 있는지가 중요하다는 걸 점점 느끼고 있습니다.

 

잠시 입장을 바꿔서 생각해보면, 내가 돈을 들여서 서비스나 물건을 살 때, 즉각적이고 확연한 만족을 원하는 것 처럼 말이죠.

 

물론 아무 공부 없이 바로 프로젝트를 할 수는 없기 때문에 공부는 꾸준히 해야합니다.

하지만 앞으로는 프로젝트의 비중을 훨씬 많이 늘리고, 그 과정과 결과물을 기록으로 남길 것입니다.

 

글을 마치며, 이번 탈락이 속상하긴 했지만 걸어왔던 길을 점검해보고 좀 더 좋은 방향으로 갈 수 있는 계기가 되어서 좋았다고 생각합니다.

 

 

 

 

 

 

 

 

 

반응형

+ Recent posts