[Python] Word/Excel/PowerPoint/PDFからテキスト抽出するライブラリ・サンプルコード

 Pythonならライブラリ使うことで、Excel, word, powerpoint, PDFから簡単に文字列抽出できます。

 いちいち全てのファイル形式について検索とか面倒だったのでこの記事にまとめます。

Word/Excel/PowerPoint/PDF抽出のサンプルコード


# Excel
import xlrd
# Word
import docx
# PowerPoint
from pptx import Presentation
# PDF
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams, LTContainer, LTTextBox
from pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManager
from pdfminer.pdfpage import PDFPage


# Word
def get_all_text_from_docx(filepath: str):
    """
    Wordファイルから全文字列を取得する
    """
    document = docx.Document(filepath)
    return "\n".join(list(map(lambda par: par.text, document.paragraphs)))

# Excel
def print_excel_file_data(filepath: str, sheet_index: int):
    """
    Excelファイルの指定したシートの文字列を出力する
    """
    wb = xlrd.open_workbook(filepath)
    print("sheets: {}".format(str(wb.sheet_names())))
    sheet = wb.sheet_by_index(sheet_index)
    for row in sheet.get_rows():
        print(row)

# powerpoint
def get_all_text_from_pptx(filepath: str):
    """
    PoerPointファイルの文字列を取得する
    """
    presentation = Presentation(filepath)
    results = []
    for slide in presentation.slides:
        for shape in slide.shapes:
            # 文字列以外は飛ばす
            if not shape.has_text_frame:
                continue
            for par in shape.text_frame.paragraphs:
                for run in par.runs:
                    results.append(run.text)
    return results

# PDF
def get_all_text_from_pdf(filepath: str):
    # ここら辺おまじない
    laparams = LAParams(detect_vertical=True)
    resource_manager = PDFResourceManager()
    device = PDFPageAggregator(resource_manager, laparams=laparams)
    interpreter = PDFPageInterpreter(resource_manager, device)

    results = []
    with open(filepath, "rb") as file:
        for page in PDFPage.get_pages(file):
            interpreter.process_page(page)
            layout = device.get_result()
            results.append(get_text_list_recursively(layout))
    return results

def get_text_list_recursively(layout):
    # テキストならそのまま返す
    if isinstance(layout, LTTextBox):
        return [layout.get_text()]

    # Containerはテキストなどを内包ため再帰探索
    if isinstance(layout, LTContainer):
        text_list = []
        for child in layout:
            text_list.extend(get_text_list_recursively(child))
        return text_list
    return []


print(get_all_text_from_docx("ファイルパス"))
print(print_excel_file_data("ファイルパス", スライド数))
print(get_all_text_from_pptx("ファイルパス"))
print(get_all_text_from_pdf("ファイルパス"))

Excel


 xlrdというライブラリを使いました。

 ちなみにxlwtという書き込み用のライブラリもあります。BSDライセンスです。

pip install xlwt

サンプル↓

https://note.nkmk.me/python-xlrd-xlwt-usage/

Word


 python-docxというライブラリを使いした。MITライセンスです。

pip install python-docx

サンプル↓

https://pg-chain.com/python-word

Power Point


 python-pptxというライブラリを使いました。MITライセンスです。

pip install python-pptx

サンプル↓

https://qiita.com/code_440/items/9998d97b480db82ef738

PDF


 pdfminerというライブラリを使いました。MITライセンスです。

pip install pdfminer.six

サンプル↓

https://qiita.com/mczkzk/items/894110558fb890c930b5

コメントを残す

メールアドレスが公開されることはありません。