파이썬으로 PPT 파일에서 텍스트 추출하기 (일명 PPT 텍스트 크롤링)

지난 포스팅에서는 동일한 양식의 엑셀 파일에서 필요한 위치의 셀 값만 가져와 저장하는 엑셀 크롤링에 대한 내용을 소개했다.

이번에는 위와 비슷하지만 조금은 다른, 일명 ‘PPT 텍스트 크롤링’에 대해서 소개하고자 한다.

PPT 파일에 있는 모든 텍스트 상자에서 텍스트 값들을 가져오는 방식이다. 하나의 PPT 파일에서 텍스트 상자의 내용을 긁어오는 것에서도 만족할 수 있지만, 여기에서는 동일한 양식에 내용만 다른 PPT 파일 여러개에서 텍스트 상자에 입력된 텍스트들을 수집하여 엑셀로 저장하는 것까지 실습해본다. 회사에서 일을 하다보면 동일한 PPT 파일을 배포하고 그 안에 답변을 채워 제출하도록 하는 무식한 방식으로 자료나 의견을 수집할 때가 있기 때문이다.

우선 하나의 PPT 파일에서 텍스트 추출하는 방법을 살펴보고 이어서 반복문을 활용하여 수집하고 엑셀에 저장하는 응용편을 소개한다.


<연습> 파워포인트 파일에서 텍스트 상자의 값을 수집하는 코드를 살펴보자.

일단 아래와 같은 sample.pptx 파일을 준비했다.

이제 파이썬 라이브러리를 통해 PPT 파일을 다뤄야 한다. 여기서는 python-pptx라는 라이브러리를 활용한다. 가볍고 사용법도 간편하다. 자세한 내용은 홈페이지를 참조하자. 설치는 아래와 같은 pip 명령어로 쉽게 진행할 수 있다.

pip install python-pptx

이 라이브러리를 활용하여 PPT 파일 내 텍스트를 추출하는 방법은 아래와 같다. result라는 임시의 리스트의 형태로 작성한 뒤 리스트를 출력해본다.

from pptx import Presentation

prs = Presentation("sample.pptx")

result = []

for slide in prs.slides:
    for shape in slide.shapes:
        if not shape.has_text_frame:
            continue
        for paragraph in shape.text_frame.paragraphs:
            result.append(paragraph.text)

print(result)

출력해보면 결과는 아래와 같다.

['제목입니다', '부제목입니다', '슬라이드2 제목입니다', '슬라이드2 내용입니다', '슬라이드3 제목입니다', '슬라이드3 내용입니다']

PPT 텍스트 추출은 쉽다. 이제부턴 응용이다.


<실전> 폴더에 저장된 모든 PPT 파일에서 텍스트를 추출하여 엑셀로 저장해보자.

만약 한 폴더에 담긴 여러개의 PPT 파일에서 모두 텍스트를 추출하려면 for 반복문을 활용하고 리스트의 리스트 형태로 저장하면 된다. os 모듈을 활용하여 파일명을 긁어 놓고 하나씩 불러와서 실행하는 방식이다.

# files 폴더에 있는 모든 PPT 파일명을 file_list 리스트에 저장하기

import os

path = "./files"
file_list = os.listdir(path)


# file_list 리스트에 있는 파일들을 하나씩 열어 텍스트를 추출하고 리스트로 저장하기

from pptx import Presentation

results = []

for file_name_raw in file_list:

    result = []
    result.append(file_name_raw)
    
    file_name = "./files/" + file_name_raw
    prs = Presentation(file_name)

    for slide in prs.slides:
        for shape in slide.shapes:
            if not shape.has_text_frame:
                continue
            for paragraph in shape.text_frame.paragraphs:
                result.append(paragraph.text)
    
    results.append(result)

print(results)

이렇게 하면 출력 결과는 아래와 같다. (참고로 리스트 맨 앞에는 파일명을 추가했다.)

[['sample1.pptx', '샘플1 제목입니다', '샘플1 부제목입니다', '샘플1 슬라이드2 제목입니다', '샘플1 슬라이드2 내용입니다', '샘플1 슬라이드3 제목입니다', '샘플1 슬라이드3 내용입니다'], ['sample2.pptx', '샘플2 제목입니다', '샘플2 부제목입니다', '샘플2 슬라이드2 제목입니다', '샘플2 슬라이드2 내용입니다', '샘플2 슬라이드3 제목입니다', '샘플2 슬라이드3 내용입니다'], ['sample3.pptx', '샘플3 제목입니다', '샘플3 부제목입니다', '샘플3 슬라이드2 제목입니다', '샘플3 슬라이드2 내용입니다', '샘플3 슬라이드3 제목입니다', '샘플3 슬라이드3 내용입니다']]

이제 이 결과를 엑셀로 저장해야 한다.

openpyxl은 엑셀 파일을 손쉽게 다룰 수 있는 파이썬 라이브러리로 이전 포스팅에서도 소개한 바 있다. 설치는 아래와 같은 pip 명령어로 쉽게 진행할 수 있다.

pip install openpyxl

openpyxl의 Workbook이라는 모듈에서 ws.append를 활용하면 하나의 행에 하나의 리스트를 추가하는 방식으로 편리하게 사용할 수 있다.

# 수집한 텍스트 리스트를 엑셀에서 행 단위로 저장하기

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

for i in results:
    ws.append(i)

wb.save("results.xlsx")

위 코드를 이어서 실행하면 아래와 같은 results.xlsx 파일이 작성되는 것을 볼 수 있다.


python-pptx 라이브러리를 잘 활용하면 파워포인트 자동화가 가능하다.

아무튼 파이썬을 잘 쓰면
일이 편해진다.

추천 글

“파이썬으로 PPT 파일에서 텍스트 추출하기 (일명 PPT 텍스트 크롤링)”의 4개의 댓글

  1. 파이썬어려워

    안녕하세요
    위 방법으로 실행해보았는데 아래와 같은 에러가 뜹니다.
    Traceback (most recent call last):
    File “경로~~~~\Python\Python38-32\topptx.py”, line 40, in
    ws.append(i)
    File “경로~~~~\Python\Python38-32\lib\site-packages\openpyxl\worksheet\worksheet.py”, line 646, in append
    cell = Cell(self, row=row_idx, column=col_idx, value=content)
    File “경로~~~~\Python\Python38-32\lib\site-packages\openpyxl\cell\cell.py”, line 113, in __init__
    self.value = value
    File “경로~~~~\Python\Python38-32\lib\site-packages\openpyxl\cell\cell.py”, line 216, in value
    self._bind_value(value)
    File “경로~~~~\Python\Python38-32\lib\site-packages\openpyxl\cell\cell.py”, line 192, in _bind_value
    value = self.check_string(value)
    File “경로~~~~\Python\Python38-32\lib\site-packages\openpyxl\cell\cell.py”, line 159, in check_string
    raise IllegalCharacterError
    openpyxl.utils.exceptions.IllegalCharacterError

    도움 부탁드려요.

    1. 오류가 발생하면 그 메시지를 복사해서 구글에 검색해보셔요!

      적어주신 걸로 제가 정확히 판단하긴 어렵지만
      일단 이 포스팅을 참고하시면 좋을 것 같네요.
      https://dlsdn73.tistory.com/1025
      xlsxwriter라는 패키지가 설치되어 있는지 확인해보시고
      적혀있는 내용대로 따라해보셔요.

  2. 파이썬어려워

    수집 문자 중 인식 안 되는 문자가 있었던 것 같습니다. 문서를 단순화 하고 테스트 하니 정상적으로 되네요.
    예외 처리를 할 수 있으면 좋겠는데… ㅠ ㅜ 제 역량이 안 되네요.

    1. 파이썬에서는 try, except, finally를 사용해서 예외처리 하는 방식이 있습니다.
      점프투파이썬 포스팅 좀 따라해보시면 도움이 되실 거예요.
      https://wikidocs.net/30

      아니면 발생할 수 있는 상황을 치밀하게 예상해서
      그걸 처리할 수 있도록 코드를 짜야겠죠…?

      사실 저도 파이썬 잘 못해요 ㅜㅜ
      문제는 계속 터질 거고
      어쨌든 그것들을 해결 하다 보면
      언젠가는 실력이 늘지 않을까 싶습니다… 화이팅…ㅜㅜ

댓글 남기기