SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

Python3でWordファイル(docx)内のテキストを検索する/Pythonサンプル

目次

Python3でWordファイル(docx)内のテキストを検索する

Wordファイル(Docx)内のテキストを検索するPythonスクリプトサンプルです。

動作確認は、Windows11/Anaconda/Python3.8で行っています。

Python-docxを使います

docxファイルを検索するには、python-docxモジュールのインストールが必要です。

python-docx.readthedocs.io

pipなら

pip install python-docx

ですかね。

 

Pythonで検索するスクリプト

ソースはこんな感じです。

from docx import Document
import glob
# import sys

# argvs = sys.argv
# argc = len(argvs)

# if (argc != 3):
#    print('引数に 検索文字 検索先フォルダパスを指定します')
#    quit()
# search_condition = argvs[1]
# folder = argvs[2]
search_condition = "滞納"
folder = "C:\\boku\\AAAA\\BBBBBBBBBB"

files = glob.glob(folder + '\\**\\*.docx', recursive=True)

for file in files:
    try:
        document = Document(file)
    except BaseException:
        continue
    count = 0
    for para in document.paragraphs:
        count += 1
        if para.text.find(search_condition) > -1:
            print(file + ":" + '行' + str(count) + ':' + para.text)

簡単に使いたいので、検索条件やフォルダはソース中に書いています。

汎用ではなく、開発環境(VSCode)でソース開いて検索条件とフォルダを書き換えて「Run without debugging」(ターミナルで実行)して結果を見る使い方だからです。

ただ、コマンドで使いたいときはあるかもしれないので、一応、引数取得処理も書いてコメントアウトしてあります。

僕はまだ使ったことがないです(笑)

 

ソースコードのポイント

短いスクリプトですし、python-docxの機能も検索しか使っていないので、特に補足・解説するようなところはないのですが1点だけ。

try:
    document = Document(file)
except BaseException:
    continue

この部分は大切です。

なぜかというと、こうしないと以下のような例外で落ちてしまって、なかなか検索がすすまないからです。

docx.opc.exceptions.PackageNotFoundError

これが発生する原因はいろいろあります。

基本的に、ショートカットでリンク切れしているものが引っかかることが多いですけど、どこにあるかわからない中間ファイル(Wordの編集中にできるやつ)がひっかかったりして、エラーになるファイルを除く対応をするのはしんどいです。

この例外が発生するのは「document = Document(file)」の時なので、そこで例外をひろって発生していたら次「ocntinue」するようにして逃げてます。

今回はこんなところで。

ではでは。