티스토리 뷰
728x90
반응형
앞선 글에서 아래한글(hwp) 문서를 읽는 방법을 살펴보았다.
이번에는 학술대회 참가신청서를 예시로 한글 문서를 읽고, 데이터를 뽑아내 엑셀화 하는 작업을 하려고 한다.
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 |
댓글