Python、機械学習

python-pptxで、パワーポイントを開かずにスライド中のテキストを検索する

多くの人が、パワーポイント(Powerpoint)を使って資料作成をされていると思います。

こんなこと、ありませんか?

「あのテーマについて書いたスライド、どのpptxファイルだったっけ?うーん、思い出せない!」

そして、片っ端からpptxファイルを開けてはスライドを確認する…。めちゃくちゃ面倒です。

python-pptxというライブラリを使えば、労力をかけずに簡単に特定することができます。

では、具体的な方法について以下説明します。

python-pptxをインストールする

まずは、python-pptxライブラリをインストールします。

python-pptxはpythonでパワーポイントのファイルを作成したり編集することができるライブラリです。

こちらのページに書いてある通り、ターミナルやコマンドプロンプト、あるいはアナコンダプロンプト上にて、pipを使ってインストールします。

Installing python-pptx

pip install python-pptx

pythonでコードを書く

python-pptxをインストールできたら、pythonでコードを書いていきます。

1)必要なライブラリをインポート

まずは、必要なライブラリをインポートします。

import pptx
from pptx.exc import PackageNotFoundError

import glob

2)検索したいフォルダを指定する

続いて、検索したいフォルダを指定します。target_pathという変数を作り、検索したいフォルダのパスを指定します。

target_path = ○○

 

絶対パスの場合

絶対パスで指定する場合は次のようになります。ここではreportという名前のフォルダを指定した場合の例を示しています。

後ろにアスタリスク(*)を1つつけると、reportフォルダの直下にあるファイルのみが指定されます。

target_path = 'C:/△△/△△/△△/△△/report/*'

 

後ろにアスタリスク(*)を2つつけると、reportフォルダの直下だけでなく、すべてのファイルが指定されます。

target_path = 'C:/△△/△△/△△/△△/report/**'

 

Windowsの場合、パスの中の「/」が「¥」や「\」になり、そのままだとエラーが出ますので、次のように冒頭に「r」を入れてください。

target_path = r'C:¥△△¥△△¥△△¥△△¥report¥**'

「¥」や「\」は正規表現で使われる特殊な記号なため、そういう意味で使っているんじゃないですよ、と教えてあげるために「r」を入れます。これをraw文字列に変換する、といいます。

 

相対パスの場合

相対パスの場合、例えば、今いるディレクトリ(フォルダ)を指定する場合は次のように書きます。

target_path = './*'

フォルダ直下のみならず、フォルダの下位フォルダ内も含めた全ファイルを指定する場合は、アスタリスクを2つにします。

3)pptxファイルを抽出する

次に、フォルダ内にあるpptxファイルを抽出します。

pptx_files= []

# target_pathで指定したフォルダ内のファイルのパスを格納
files = glob.glob(target_path, recursive=True)
# このうち「.pptx」がつくものだけを抽出し、pptx_filesに格納
for file in files:
    if '.pptx' in file:
        pptx_files.append(file)

# 「pptx_files」のリストに格納されたパスを表示
for pptx_file in pptx_files:
    print(pptx_file)

# 「pptx_files」のリストに格納されたパスの数を表示
len(pptx_files)

pptxファイルのパスの一覧、およびpptxファイルの数が表示されるかと思います。

4)pptxファイルの中に書かれているテキストデータを一気に抽出する

いよいよ、テキストデータの抽出です。次のようなコードで実装します。

# 抽出したテキストデータを格納する空リスト
extracted_texts = []

# テキストデータが抽出されたpptxファイルのパスを格納する空リスト
pathes = []

# テキストデータが抽出されたスライドのページを格納する空リスト
slide_num = []


for pptx_file in pptx_files:
    # パスワードがかかったpptxファイルへの対応
    try:
        prs = pptx.Presentation(pptx_file)
        
    except PackageNotFoundError:
        print(pptx_file)
        print('→パスワードがかかっているため、開けませんでした。')
        print(' '*40)

    
    # スライドごとにテキストデータを抽出する
    for i, sld in enumerate(prs.slides, start=1):
        for shape in sld.shapes:
            if shape.has_text_frame: # shapeに含まれるテキストデータを抽出
                pathes.append(pptx_file)
                slide_num.append(i)
                extracted_texts.append(shape.text)

            if shape.has_table: # tableに含まれるテキストデータを抽出
                for cell in shape.table.iter_cells():
                    pathes.append(pptx_file)
                    slide_num.append(i)
                    extracted_texts.append(cell.text)

 

pptxファイルの中には、パスワードで保護されたものが含まれるかもしれません。そこで、「パスワードがかかっているため、開けませんでした」とアナウンスできるよう、try, exceptの例外処理の記述を入れました。

5)キーワード検索ができるようにする

最後に、キーワード検索ができるようにします。

抽出したテキストの中に入力したキーワードが含まれていたら、そのテキストを返してくれるコードです。

さらに、テキストのみならずpptxファイルのパスとスライドページも知らせてくれます。

検索ヒット数も表示できるようにしました。

key_word = str(input("検索ワードを記入して下さい。:  "))
print(' '*40)
print('-----検索結果-----')

number_of_hits = 0

for n in range(0, len(extracted_texts)):
    if key_word in extracted_texts[n]:
        number_of_hits += 1
        print(' '*40)
        print('( No.' + str(number_of_hits) + ' )')
        print('■pptxファイルのパス')
        print(pathes[n])
        print(' '*40)
        print('■スライドのページ')
        print(slide_num[n])
        print(' '*40)
        print('■ヒットしたテキスト')
        print(extracted_texts[n])
        print(' '*40)
        print('-'*40)

# ヒット数を表示
print(' '*40)
print(' '*40)
print('ヒット数: ' + str(number_of_hits))

 

まとめ

python-pptxを用いて、複数のPowerpointファイル内のテキストをキーワード検索できるプログラムを作成しました。

pptxファイルをいちいち開かずとも、所望の情報がどのpptxファイルのどのページに記載されているか、瞬時に把握することができますので是非活用してみてください。

補足:pptファイルは取り扱えない

なお、旧来の拡張子であるpptのファイルは、残念ながら本方法では取り扱えませんのでご注意ください。