티스토리 뷰
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
반응형
'Study > Ect' 카테고리의 다른 글
[Python] 구글 드라이브 링크로 파일 다운 받기 (gdown / gdrive dataset) (0) | 2023.06.09 |
---|---|
[Python] 압축 폴더 해제하는 방법 (zip 압축 풀기) (0) | 2023.06.09 |
[Python] Colab에서 아래한글(hwp) 문서 읽기 (2) | 2023.05.02 |
[Python] Colab에서 word 문서 다루기 (0) | 2023.05.02 |
[Python] numpy 없이 전치행렬 구현하기(map,zip) (0) | 2023.03.26 |
댓글