본문 바로가기
아래아한글 자동화/python+hwp 중급

[Q&A](3/3) 제목을 {문서첫줄}.hwp로 저장하는 가장 쿨한 방법

by 일코 2022. 1. 14.


지난 포스팅

 

[Q&A](1/3) 제목을 {문서첫줄}.hwp로 저장하는 가장 쿨한 방법

안녕하세요? 일상의 코딩, 일코입니다. 질문을 읽어보니 대략 이런 상황인 것 같습니다. 1. 아래와 같은 내용의 파일이 있고, 2. 이걸 아래와 같이 만들고 싶으신 것 같습니다. 여기서 잠깐 이 생

martinii.fun

 

 

[Q&A] hwp파일을 페이지별로 나눈 후, 제목을 {문서첫줄}.hwp로 저장하는 가장 간단한 방법[2/3]

안녕하세요? 일상의 코딩, 일코입니다. 두 번째 시간입니다. 지난 시간에는 한/글을 열지 않고도 첫 줄을 불러오는 함수를 소개해드렸습니다. def 첫줄읽기(filepath): """한/글 문서 텍스트를 불러와

martinii.fun


안녕하세요? 상의 딩, 일코입니다.

마지막, 세 번째 시간입니다.

 

지난 시간까지 진행하면서

①파일목록을 GUI로 선택하고,

②(한/글을 열지 않고도)첫 줄을 불러와서,

③파일이름을 바꾸는 오는 함수까지 작성해보았습니다.

import os
from tkinter import Tk
from tkinter.filedialog import askopenfilenames
from olefile import OleFileIO


def 첫줄읽기(filepath):
    """한/글 문서 텍스트를 불러와서 엔터(\r\n)로 쪼갠 후 첫 번째 행 리턴"""
    with OleFileIO(filepath) as ole:  # 한/글 파일 불러오기
        text = ole.openstream('PrvText').read().decode('UTF-16').split("\r\n")[0]
    return text


def 파일목록선택():
    """
    이름을 변경할 한/글 파일을 모두 선택하는 함수.
    파일명을 포함한 한/글 파일의 전체경로를 리스트로 리턴함
    """
    root = Tk()  # GUI 실행하고
    filenames = askopenfilenames(title="이름을 변경할 한/글 파일을 선택해주세요.",
                                 initialdir=os.getcwd(),  # 실행한 위치
                                 filetypes=[("한/글파일", "*.hwp *.hwpx")])
    root.destroy()  # GUI 종료
    return filenames


def 일괄변경(파일경로리스트):
    for 파일 in 파일경로리스트:
        첫줄 = 첫줄읽기(파일)
        os.rename(파일, 파일.rsplit("/", maxsplit=1)[0] + f"/{첫줄}.hwp")

이제 메인파트만 만들어 컴파일하면 완성입니다.

메인파트는 함수나 클래스를 정의하는 부분과 분리해서 코드 맨 하단에 작성해야 합니다.

그 규칙을 지키지 않고, 함수정의하는 라인 중간에 함수를 실행하는 명령어가 들어있으면

만에 하나 다른 프로그램을 제작하면서 기존 파일의 함수 일부를 쓰고 싶어 모듈로 임포트할 때

그 모듈 중간에 들어가 있는 코드들이 (원치 않게) 임포트하면서 실행되어버리기 때문입니다.

그걸 방지하기 위해, 코드 맨 하단에

if __name__ == '__main__':
    """코드작성"""

이와 같은 라인을 작성하고 그 아래에다 실행 명령어를 쓰면 됩니다.

다소 라인이 긴데, 파이참을 사용하신다면 "main"만 입력하고 <tab>키를 누르시면 됩니다.

메인파트에 아래와 같이 코드를 입력해봅시다. 함수의 용도를 기억하면서 따라해봅시다.

if __name__ == '__main__':
    파일리스트 = 파일목록선택()
    일괄변경(파일리스트)

끝!

메인파트는 생각보다 간단하네요?

여러분만 사용하시겠다면, 이 상태로 실행해도 됩니다.

작성한 코드파일의 확장자인 py를 pyw로 고친 후 더블클릭해봅시다.

혹시 파이썬 버전이 여러 개 설치되어 있는 경우라면, 아래와 같은 팝업이 뜰 수 있습니다.

이 때는 아무 거나 선택하지 마시고, olefile이 설치되어 있는 적절한 파이썬 버전을 선택하셔야 합니다.

이제 해당 pyw파일을 더블클릭하시면 (에디터로 열리는 것이 아니라) 파일이 실행됩니다.

잘 실행되는 것을 확인.

포스팅을 마치기 전, 마지막 순서로

pyinstaller를 사용한 컴파일을 해 보겠습니다.

 

이 프로그램을 다른 사람의 PC, 즉 파이썬이 설치되어 있지 않은 PC에서 실행하려면

"컴파일"이라는 작업을 해야 합니다.

우리가 작성한 코드는 용량이 고작 1킬로바이트 정도로 짧지만

컴파일된 파일에는 파이썬 인터프리터와 모듈이 모두 포함되므로

보통 수십메가 정도로 용량이 커진 exe파일이 됩니다.

알약이나 백신프로그램은 이걸 바이러스로 인지하기도 합니다.

그럼에도 불구하고 이게 필요한 경우들이 있을 수 있으므로 짧게 소개합니다.

우선 (pyw 파일은 다시 py로 고쳐놓은 후) pip로 파이인스톨러를 설치합니다.

pip install pyinstaller

pyinstaller 설치장면.

그 후에 코드가 있는 폴더에서 아래와 같이 입력합니다.

pyinstaller -F -w 첫줄로파일명변경.py

-F 는 "인터프리터와 모듈 등 모두를 한 개의 실행파일로 압축해서"

-w 는 "콘솔창을 띄우지 않고" 라는 옵션입니다.

컴파일 완료. 처음 실행시에는 약 1분 가까이 길어질 수도 있음.

이제 실행위치로 가보시면 "build"와 "dist"라는 폴더가 생성되어 있을 겁니다.

"dist" 폴더 안에 컴파일된 실행파일이 있습니다.

용량이 약 10메가 가까이 하네요.

마지막으로 실행장면과 코드를 남기고 이번 3부작을 마칩니다.

완성!

최종코드는 아래와 같습니다.

import os
from tkinter import Tk
from tkinter.filedialog import askopenfilenames
from olefile import OleFileIO


def 첫줄읽기(filepath):
    """한/글 문서 텍스트를 불러와서 엔터(\r\n)로 쪼갠 후 첫 번째 행 리턴"""
    with OleFileIO(filepath) as ole:  # 한/글 파일 불러오기
        text = ole.openstream('PrvText').read().decode('UTF-16').split("\r\n")[0]
    return text


def 파일목록선택():
    """
    이름을 변경할 한/글 파일을 모두 선택하는 함수.
    파일명을 포함한 한/글 파일의 전체경로를 리스트로 리턴함
    """
    root = Tk()  # GUI 실행하고
    filenames = askopenfilenames(title="이름을 변경할 한/글 파일을 선택해주세요.",
                                 initialdir=os.getcwd(),  # 실행한 위치
                                 filetypes=[("한/글파일", "*.hwp *.hwpx")])
    root.destroy()  # GUI 종료
    return filenames


def 일괄변경(파일경로리스트):
    for 파일 in 파일경로리스트:
        첫줄 = 첫줄읽기(파일)
        os.rename(파일, 파일.rsplit("/", maxsplit=1)[0] + f"/{첫줄}.hwp")


if __name__ == '__main__':
    파일리스트 = 파일목록선택()
    일괄변경(파일리스트)

다소 아쉬운 부분도 있고, 보완하고 싶은 부분도 많기는 해요. 완성했다고 말하기 부끄럽네요.

그래도 뭐, 이 정도면 의도대로 돌아가는 프로그램을 만들었다고 볼 수 있겠네요.

사용하시는 분들께서 더 멋진 프로그램으로 완성해서 사용해 주시기 바랍니다.

행복한 하루 되세요!

 

도움이 되었거나, 앞으로 도움이 될 것 같다고 생각해주신다면 구독해 주시고,

아래 커피 후원하기 버튼으로 아이스아메리카노 한 잔 부탁드려요^^


donaricano-btn

 

댓글