【Python】Word文書からテキストを抽出する方法

この記事では、Pythonのライブラリ python-docx を使って、Word文書を読み込み、段落やセクション、表からテキストを抽出する基本的な方法を解説します。

また、特定のキーワードを含む段落の抽出や、テキストのフォーマット情報の取得、画像の抽出などの応用例も紹介します。

さらに、よくあるエラーとその対処法、デバッグのポイントについても触れています。

初心者でもわかりやすいように、サンプルコードと実行結果を交えながら説明していきますので、ぜひ最後までご覧ください。

目次から探す

python-docxを使った基本操作

PythonでWord文書(.docxファイル)からテキストを抽出するためには、python-docxというライブラリを使用します。

このライブラリは、Word文書の読み書きを簡単に行うための便利なツールです。

以下では、python-docxを使った基本操作について解説します。

DOCXファイルの読み込み

まずは、python-docxライブラリをインストールする必要があります。

以下のコマンドを実行してインストールしてください。

pip install python-docx

インストールが完了したら、次にDOCXファイルを読み込む方法を見ていきましょう。

以下のコードは、python-docxを使ってDOCXファイルを読み込む基本的な方法です。

from docx import Document
# DOCXファイルのパスを指定
file_path = 'example.docx'
# DOCXファイルを読み込む
doc = Document(file_path)
print("DOCXファイルを正常に読み込みました。")

このコードでは、Documentクラスを使用して指定したパスのDOCXファイルを読み込んでいます。

file_pathには読み込みたいDOCXファイルのパスを指定してください。

ドキュメントオブジェクトの取得

DOCXファイルを読み込んだ後は、ドキュメントオブジェクトを操作してテキストを抽出することができます。

ドキュメントオブジェクトには、段落や表などの要素が含まれています。

以下のコードは、ドキュメントオブジェクトから段落を取得し、そのテキストを表示する方法を示しています。

from docx import Document
# DOCXファイルのパスを指定
file_path = 'example.docx'
# DOCXファイルを読み込む
doc = Document(file_path)
# ドキュメント内のすべての段落を取得
for paragraph in doc.paragraphs:
    print(paragraph.text)

このコードでは、doc.paragraphsを使用してドキュメント内のすべての段落を取得し、各段落のテキストを表示しています。

paragraph.textを使うことで、各段落のテキストを簡単に抽出することができます。

以上が、python-docxを使った基本操作です。

次のセクションでは、具体的なテキストの抽出方法について詳しく見ていきます。

テキストの抽出方法

段落からのテキスト抽出

段落オブジェクトの取得

まず、Word文書から段落オブジェクトを取得する方法について説明します。

python-docxライブラリを使用すると、ドキュメント内のすべての段落を簡単に取得できます。

以下のコード例を見てみましょう。

from docx import Document
# DOCXファイルを読み込む
doc = Document('example.docx')
# ドキュメント内のすべての段落を取得
paragraphs = doc.paragraphs
# 段落の数を表示
print(f'段落の数: {len(paragraphs)}')

このコードでは、doc.paragraphsを使用してドキュメント内のすべての段落を取得しています。

paragraphsはリスト形式で、各要素が段落オブジェクトとなります。

段落内のテキスト抽出

次に、取得した段落オブジェクトからテキストを抽出する方法を説明します。

段落オブジェクトのtext属性を使用すると、段落内のテキストを簡単に取得できます。

# 各段落のテキストを表示
for i, paragraph in enumerate(paragraphs):
    print(f'段落 {i+1}: {paragraph.text}')

このコードでは、paragraphsリストをループして各段落のテキストを表示しています。

paragraph.textを使用することで、段落内のテキストを取得できます。

セクションからのテキスト抽出

セクションオブジェクトの取得

Word文書は複数のセクションに分かれていることがあります。

python-docxを使用すると、ドキュメント内のセクションオブジェクトを取得することも可能です。

以下のコード例を見てみましょう。

# ドキュメント内のすべてのセクションを取得
sections = doc.sections
# セクションの数を表示
print(f'セクションの数: {len(sections)}')

このコードでは、doc.sectionsを使用してドキュメント内のすべてのセクションを取得しています。

sectionsはリスト形式で、各要素がセクションオブジェクトとなります。

セクション内のテキスト抽出

セクションオブジェクト自体にはテキストが含まれていませんが、セクション内の段落や他の要素からテキストを抽出することができます。

以下のコード例では、各セクション内の段落からテキストを抽出しています。

# 各セクション内の段落のテキストを表示
for i, section in enumerate(sections):
    print(f'セクション {i+1}:')
    for paragraph in section.paragraphs:
        print(paragraph.text)

このコードでは、各セクション内の段落をループしてテキストを表示しています。

section.paragraphsを使用することで、セクション内の段落を取得できます。

表からのテキスト抽出

表オブジェクトの取得

Word文書には表が含まれていることがあります。

python-docxを使用すると、ドキュメント内の表オブジェクトを取得することができます。

以下のコード例を見てみましょう。

# ドキュメント内のすべての表を取得
tables = doc.tables
# 表の数を表示
print(f'表の数: {len(tables)}')

このコードでは、doc.tablesを使用してドキュメント内のすべての表を取得しています。

tablesはリスト形式で、各要素が表オブジェクトとなります。

表内のセルからのテキスト抽出

次に、取得した表オブジェクトからセル内のテキストを抽出する方法を説明します。

表オブジェクトのrows属性とcells属性を使用すると、各セルのテキストを簡単に取得できます。

# 各表のセル内のテキストを表示
for i, table in enumerate(tables):
    print(f'表 {i+1}:')
    for row in table.rows:
        for cell in row.cells:
            print(cell.text)

このコードでは、tablesリストをループして各表のセル内のテキストを表示しています。

row.cellsを使用することで、行内の各セルを取得できます。

以上が、Word文書からテキストを抽出する基本的な方法です。

これらの方法を組み合わせることで、より複雑なテキスト抽出も可能になります。

応用例

ここでは、基本的なテキスト抽出方法を応用して、特定のキーワードを含む段落の抽出や、テキストのフォーマット情報の取得、さらには画像やその他のメディアの抽出方法について解説します。

特定のキーワードを含む段落の抽出

特定のキーワードを含む段落を抽出するには、段落ごとにテキストをチェックし、キーワードが含まれているかどうかを確認します。

以下にそのサンプルコードを示します。

from docx import Document
# DOCXファイルを読み込む
doc = Document('example.docx')
# キーワードを含む段落を抽出する
keyword = "Python"
for para in doc.paragraphs:
    if keyword in para.text:
        print(para.text)

このコードでは、example.docxというファイルから段落を読み込み、各段落に対してキーワード Python が含まれているかをチェックしています。

含まれている場合、その段落のテキストを出力します。

テキストのフォーマット情報の取得

テキストのフォーマット情報(例えば、太字、斜体、下線など)を取得するには、各段落のラン(Run)オブジェクトを調べます。

ランオブジェクトは、段落内の連続したテキストの一部で、同じフォーマットが適用されています。

以下に、テキストのフォーマット情報を取得するサンプルコードを示します。

from docx import Document
# DOCXファイルを読み込む
doc = Document('example.docx')
# 各段落のフォーマット情報を取得する
for para in doc.paragraphs:
    for run in para.runs:
        text = run.text
        bold = run.bold
        italic = run.italic
        underline = run.underline
        print(f"Text: {text}, Bold: {bold}, Italic: {italic}, Underline: {underline}")

このコードでは、各段落のランオブジェクトを取得し、そのテキストとフォーマット情報(太字、斜体、下線)を出力します。

画像やその他のメディアの抽出

Word文書には、テキストだけでなく画像やその他のメディアも含まれていることがあります。

これらのメディアを抽出するには、python-docxライブラリのinline_shapesプロパティを使用します。

以下に、画像を抽出するサンプルコードを示します。

from docx import Document
# DOCXファイルを読み込む
doc = Document('example.docx')
# 画像を抽出する
for shape in doc.inline_shapes:
    if shape.type == 3:  # 3は画像のタイプ
        image = shape._inline.graphic.graphicData.pic.blipFill.blip.embed
        image_part = doc.part.related_parts[image]
        with open(f'image_{image}.png', 'wb') as f:
            f.write(image_part.blob)
        print(f"Image saved as image_{image}.png")

このコードでは、example.docxというファイルから画像を抽出し、image_{image}.pngという名前で保存します。

inline_shapesプロパティを使用して、文書内のすべてのインラインシェイプを取得し、その中から画像を特定して抽出しています。

以上が、特定のキーワードを含む段落の抽出、テキストのフォーマット情報の取得、画像やその他のメディアの抽出方法です。

これらの応用例を活用することで、Word文書から必要な情報を効率的に抽出することができます。

エラーハンドリングとデバッグ

PythonでWord文書からテキストを抽出する際には、いくつかのエラーや問題が発生することがあります。

ここでは、よくあるエラーとその対処法、そしてデバッグのポイントについて解説します。

よくあるエラーとその対処法

1. ファイルが見つからないエラー

FileNotFoundError: [Errno 2] No such file or directory: 'example.docx'

このエラーは、指定したファイルが存在しない場合に発生します。

ファイルパスが正しいか、ファイルが存在するかを確認してください。

from docx import Document
try:
    doc = Document('example.docx')
except FileNotFoundError:
    print("指定されたファイルが見つかりません。ファイルパスを確認してください。")

2. 読み取り専用エラー

PermissionError: [Errno 13] Permission denied: 'example.docx'

このエラーは、ファイルが読み取り専用である場合や、アクセス権限がない場合に発生します。

ファイルのアクセス権限を確認し、必要に応じて変更してください。

try:
    doc = Document('example.docx')
except PermissionError:
    print("ファイルにアクセスする権限がありません。ファイルのアクセス権限を確認してください。")

3. 無効なファイル形式エラー

ValueError: The file 'example.txt' is not a Word file, it has to be a .docx file.

このエラーは、指定したファイルがWord形式(.docx)でない場合に発生します。

ファイル形式を確認し、正しい形式のファイルを指定してください。

try:
    doc = Document('example.txt')
except ValueError:
    print("指定されたファイルはWord形式ではありません。正しい形式のファイルを指定してください。")

デバッグのポイント

1. ログを活用する

デバッグの際には、ログを活用することで問題の特定が容易になります。

Pythonのloggingモジュールを使用して、重要な情報をログに記録しましょう。

import logging
from docx import Document
logging.basicConfig(level=logging.INFO)
def read_docx(file_path):
    try:
        logging.info(f"ファイル '{file_path}' を読み込んでいます...")
        doc = Document(file_path)
        logging.info("ファイルの読み込みに成功しました。")
        return doc
    except Exception as e:
        logging.error(f"エラーが発生しました: {e}")
        return None
doc = read_docx('example.docx')

2. ステップ実行で問題を特定する

デバッグツールを使用して、コードをステップ実行することで、どの部分で問題が発生しているかを特定できます。

Pythonの統合開発環境(IDE)には、デバッグ機能が備わっているものが多いので、それらを活用しましょう。

3. 例外処理を適切に行う

例外処理を適切に行うことで、エラーが発生した際にプログラムがクラッシュするのを防ぎ、エラーメッセージをユーザーに提供することができます。

tryexceptブロックを使用して、予期されるエラーをキャッチし、適切な対処を行いましょう。

try:
    doc = Document('example.docx')
    # テキスト抽出処理
except FileNotFoundError:
    print("指定されたファイルが見つかりません。")
except PermissionError:
    print("ファイルにアクセスする権限がありません。")
except Exception as e:
    print(f"予期しないエラーが発生しました: {e}")

以上が、PythonでWord文書からテキストを抽出する際のエラーハンドリングとデバッグのポイントです。

これらの方法を活用して、効率的に問題を解決し、スムーズにプログラムを実行できるようにしましょう。

目次から探す