본문 바로가기

파이썬186

[세상 쉬운 파이썬중급] nonlocal? closure? yield? generator? 파이썬 입문 레벨을 즐겁게 공부하신 분들이 상당히 버거워하시는 몇 가지 키워드가 있더라고요. 대표적으로 yield, nonlocal, closure나, 코루틴, 제너레이터, 스레드 같은.. 중요하기도 하고, 이해하고 나면 의외로 간단한데 처음엔 겁이 덜컥 나는 키워드들 있잖아요ㅎㅎ 그래서, 최대한 간단한 예제를 가지고 생소한 키워드나 문법을 차근차근 뿌시는 영상 시리즈를 기획해보았습니다. 20분 내외 x 총 10회 정도로 구상중입니다. 문법을 정리하는 시간도 되고, 요새 심란한 마음이 다소나마 차분해지는 것 같아 개인적으로는 제작이 즐겁습니다. (업무자동화 콘텐츠 소재고갈 때문이기도 하고;;;) 하여튼 첫 영상은 클로저와 제너레이터에 대해 다뤄보았습니다. 파이썬 입문에서 실력이 멈췄다 싶은 분들께 추천드.. 2024. 3. 13.
[pyhwpx] hwp.put_field_text에 입력 가능한 6가지 자료구조☆☆☆☆☆ 파이썬의 창시자 Guido Van Rossum 선생님은 말씀하셨지. Readability comes first, performance next. 가독성보다는 성능에 치중해서, 비교적 복잡한 메서드를 사용하는 프로그래머들에게 "경미한 성능향상보다는 가독성을 중시해서 코딩하라"는 맥락으로 연산자 오버로딩의 장점에 대해 다루면서 하신 말씀이긴 했지만, pyhwpx의 문법도 가급적 사용자 지향적으로, 성능보다는 가독성이나 편의 위주로 코드를 짜보고 있다. 약간 과하다 싶을만큼 추상화를 하기도 했고, "로우코드"스럽게 만들고 싶었다. (그렇다고 성능을 엄청 버린 건 아니고.. 내부적으로는 최대한 빠른 방법을 썼다.) 그 중 최고로 유용하게 쓰일 메서드를 고르라면 단연 put_field_text를 꼽고 싶은데(그 .. 2024. 2. 10.
[pyhwpx] 삽입할 필드가 너무 많을 때 : hwp.set_field_by_bracket() 아래아한글 문서를 자동화할 때 가장 많이 사용하는 기법은 역시 "필드삽입"이다. 누름틀이나 셀필드를 미리 삽입해 두고 엑셀문서나 데이터프레임에서 필드를 일괄삽입하는 방식으로 hwp 문서를 자동화할 수 있는데, 문제는 필드가 너무 많을 때에는 필드 삽입작업도 너무 귀찮다는 것. 예를 들어 아래의 문서를 자동화하려면 저 빈 칸에 전부 필드를 삽입해야 한다고 생각하면 자동화를 위한 준비작업조차 빡센 상황이 된다... 실제로는 이런 경우에는 필드삽입보다 한 행만 남겨놓고, 나머지 행을 삭제한 후 소스(엑셀파일)에 맞춰 동적으로 행을 추가해 가는 방식이 더 적절할 것 같기는 하다. 나중에 다뤄볼 것. 이런 경우에는 set_field_by_bracket을 사용해보자. 필드가 매겨질 곳에 대괄호 두겹으로 필드명을 써.. 2024. 2. 10.
[pyhwpx] 메모 또는 메모고침표 일괄삽입하는 예제 국립국어원에서는 일본어투 생활용어와 권장표현을 정리하여 두 차례 공개한 바 있다. (아이러니하게도 최근 공개한 자료의 용어 수가 50개로 예년의 자료에 비해 훨씬 적다.) 위 문서를 다운받은 후 아래 코드를 실행하면 교정표 데이터프레임이 만들어진다. import pandas as pd from pyhwpx import Hwp hwp = Hwp() hwp.open("이제부터는 분빠이하지 말고 각자내기합시다_보도자료.hwp") df = hwp.table_to_df(-1) # 1열 제거 df.drop("", axis=1, inplace=True) # 동일명의 칼럼끼리 병합하기 df.columns = [0, 1, 2, 3] df1 = df[[0, 1]] df2 = df[[2, 3]] df1.columns = [.. 2024. 2. 10.
[pyhwpx] 한 줄의 코드로 자간자동조절 : auto_spacing 아래아한글 보고서 작성할 때, 자간 조절 작업만큼 사람 기빠지게 하는 작업이 또 있을까요ㅜ 맞아요. 힘들어서가 아니라, 자괴감이 들지요. HTML 삽입 미리보기할 수 없는 소스 격한 공감ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ 윗분들은... 그냥 읽으시면 되는데, 외국인들은 자간조절 같은 거 안 하고 그냥 단어단어 끊어서 잘만 쓰던데.. "보기 좋다는" 보고서를 만들기 위해 자간조절 따위에 시간을 쓰고 있으면 정말 스트레스 받습니다. 팀장, 처장, 본부장, 사장이라는 사람들이 줄글에 단어 하나 끊어졌다고 문맥파악 못 하는 것도 아니고, 보고서 읽는 시간이 엄청 길어지는 것도 아닌데ㅜ 이상한 공무행정 관행이 우리나라에만 유난히 굳어져 있는 것 같아요. 그럼에도 하여튼, 이런 자간조절 작업 때문에 퇴근을 10분 더 늦.. 2024. 1. 26.
[pyhwpx] set_current_field_name 의 용도 : 셀에 필드 넣기 개인적인 생각이지만, 아래아한글 자동화의 90%는 필드 활용이 아닐까? 그 외의 반복업무 대부분은 정말 특수한 경우가 아닌 이상 손으로 하는 게, 코드 공부해서 적용하는 것보다 훨씬 빠를 것이다. 그냥 그런 생각이 들었다. 필드 만들고 채우고 꺼내고 하는 기능 외의 대부분의 기능은 부차적이라는 느낌. 급하지 않다면 그냥 틈틈이 연습하다가 때가 되면 써먹을 수 있지만, 대부분의 업무들은 급하니까. 오늘의 본론은 누름틀/필드를 생성할 때 사용할 수 있는 메서드는 두 가지가 있다. 누름틀 필드는 hwp.create_field(field, direction, memo) 셀필드는 hwp.set_current_field_name(field) 왜 이렇게 둘로 나눠야 했을까? 셀 안에도 누름틀을 넣을 수 있기 때문이다.. 2024. 1. 17.
[pyhwpx] gradation_on_cell 활용 일명, 이미지에 어울리는 배경 그라데이션 깔아주기! 이런 배경을 자동으로 생성할 수 있다? 증명사진이나, 투명영역이 있는 png 이미지 배경 그라데이션으로 적용해볼 수 있을 것. 다만, 어울리는 색이라기보다는 colorgram이라는 모듈을 이용해서 n개의 대표색상을 추출해서 한/글과 연동하여 그라데이션을 생성한다. 색상을 추출하는 코드는 아래와 같다. %pip install colorgram.py import colorgram # pip설치할 때 .py가 붙는 모듈은 정말 처음 봤다ㄷㄷㄷ colors = colorgram.extract('./sample.png', 7) # 대표색상 7개 추출 colors_list = [tuple(i.rgb) for i in colors] print(colors_list).. 2024. 1. 15.
[pyhwpx 개발일지] 여러 표를 병합하는 TableMergeTable 기존 API에서 실행방법은 아래와 같다. import win32com.client as win32 hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject") hwp.HAction.Run("TableMergeTable") 현재 표 아래 (다른 내용 없이) 표가 있는 경우 현재 표와 아래의 표 하나를 병합한다. 표가 없는 경우 False를 리턴하며, 오류팝업이 하나 발생한다. 또한 "셀 선택" 상태에서는 작동하지 않는다. 그래서 pyhwpx.Hwp()의 TableMergeTable 메서드는 위 작동방식을 조금 수정했다. 1. 표가 없는 경우 False를 리턴하되, 오류메시지는 뜨지 않게. 처음엔 단순히 SetMessageBoxMode(0x1)로 간단히 팝업을 안 .. 2024. 1. 14.
[pyhwpx] 개발일지, get_into_nth_table 메서드에 대한 고찰? 한/글 문서에서 n번째 표 안에 접근하고 싶은 경우가 있다. 내용을 채우고 싶다든지, 지우고 싶다든지 등의 가공을 해야 하는데, n번째 표에 접근하는 오토메이션 API는 아래와 같다. import win32com.client as win32 hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject") hwp.XHwpWindows.Item(0).Visible = True hwp.Open(한글/파일/경로.hwp) n = 10 # 문서 내 10번째 표에 접근하고 싶은 경우 idx = 0 ctrl = hwp.HeadCtrl while ctrl: if ctrl.UserDesc == "표": idx += 1 if idx == n: hwp.SetPosBySet(ctrl.Ge.. 2024. 1. 14.