티스토리 뷰

728x90
반응형

앞선 글에서 아래한글(hwp) 문서를 읽는 방법을 살펴보았다.

 

[Python] Colab에서 아래한글(hwp) 문서 읽기

Colab을 사용해 아래한글 문서를 받아 엑셀로 정리하는 작업을 하려고 한다. 윈도우에서 한글 문서를 다루는 패키지로 pyhwp가 있지만, Colab에서는 리눅스 OS를 사용하기 때문에 pyhwp로 아래한글 문

code-angie.tistory.com

이번에는 학술대회 참가신청서를 예시로 한글 문서를 읽고, 데이터를 뽑아내 엑셀화 하는 작업을 하려고 한다.

text를 split을 통해 나누고 replace를 통해 정제하는 정도만 알고 있어도 쉽게 할 수 있는 작업이다.

1. 패키지 불러오기

# 별도 설치가 필요한 패키지는 설치를 해준다.
!pip install olefile
import olefile
import os
import pandas as pd

2. 한글(hwp) 파일 읽기

def read_hwp(path): # path = "파일위치/파일.hwp"
    f = olefile.OleFileIO(path)
    # 신청서가 짧은 분량이라 미리보기 뷰로도 충분히 내용을 가져올 수 있음
    encoded_txt = f.openstream("PrvText").read()
    text = encoded_txt.decode("utf-16",errors="ignore")
    return text

3. text 정제하기

신청서에서는 표 내용만 뽑아내려고 한다.

PrvText를 통해 가져온 text에서는 표의 셀이 <> 기호로 구분되어 있다. (BodyText는 없음 주의)

표 안의 내용엔 띄어쓰기가 중요하지 않음으로 빈칸을 없애고,

text 데이터에서 표의 내용을 다음과 같이 table 리스트로 저장한다.

def text2table(text):
    # 표의 내용만 가져오기 위해 다음과 같이 "><" 기호로 셀을 분리하고,
    # "<" 기호가 있는 경우에만 text데이터를 리스트로 담음
    text = text.replace(" ","").replace("><","\t").replace(">","") 
    text = text.split("\r\n")
    table = [t.replace("<","").split("\t") for t in text if len(t) > 0 and t[0] == "<"]
    return table

4. 필요한 데이터를 뽑아 리스트에 담기

신청서의 포맷은 동일함으로 table 리스트의 위치에 따라 필요 데이터만 뽑아낸다.

이 때 필요한 경우 if 조건 등을 활용해 원하는 데이터만 뽑아낼 수 있다.

def text2data(table):
    # '성명', '소속', '휴대폰' 등의 데이터 위치를 파악해 해당 내용만 뽑아 저장
    datas = []
    datas.append(table[0][1]) # 홍길동
    datas.append(table[1][1]) # ㅇㅇ대학교
    datas.append(table[2][2]) # 010-0000-0000

    # "참가형태"의 경우에는 3가지 중 택 1이기 때문에 우선 빈칸을 입력한 뒤, 
    # 선택된 데이터를 입력하는 방법을 취함 (선택을 안한 에러가 있을 수 있기 때문)
    datas.append("")
    for param in table[3]:

      # □ 기호가 ■ 혹은 ▣ 등으로 바뀌었다면 체크한 것
      if param[0] != "□":
        # 만약 이미 데이터가 들어있다면 중복 선택임을 표시할 수 있음
        # if datas[3] != "": 
        #   print("두 가지 이상을 선택함")
        if "학술대회+Workshop" in param:
          datas[3]="학술대회+Workshop"
        elif "학술대회" in param:
          datas[3]="학술대회"
        elif "Workshop" in param:
          datas[3]="Workshop"
          
	return datas

5. 모든 문서에 대하여 데이터를 담아 저장하기

문서 class를 만들고, 모든 문서에 대하여 데이터를 가져올 수 있다.

class HWPfile():
	def __init__(self,path):
    	self.text = self.read_hwp(path)
        self.table = self.text2table(self.text)
        self.datas = self.text2data(self.table)
    
    def read_hwp(path):
    	# 생략
        return text
    
    def text2table(text):
    	# 생략
        return table
    
    def text2data(table):
    	# 생략
        return datas
# 파일명 리스트
file_list = [name for name in os.listdir('.') if name[-3:]=="hwp"]

# 문서 내 데이터
datas = []
for path in file_list:
  data = HWPfile(path)
  datas.append(data.datas)

# dataframe에 담아 csv 혹은 엑셀로 저장
cols = ['성명', '소속', '휴대폰', '참가형태']
df = pd.DataFrame(datas, columns=cols)
df.to_csv("sample.csv")
df.to_excel("sample.xlsx")
728x90
반응형
댓글