"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

PythonでWordの「docx」ファイルのテキストを検索する

目次

PythonでWordの「docx」ファイルのテキストを検索する

wordで作った資料を探し回るときがたまにあります。

そんな時にキーワード検索したくなるのですが、フリーソフトとか探すのも面倒な時に僕が使うスクリプトです。

万人向けとはいえません。

ソフト立ち上げるより、VSCode立ち上げてPythonスクリプト走らしたほうが気楽と考えるような人間向けなので、すいません。

 

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」するようにして逃げてます。

今回はこんなところで。

ではでは。