概要
Word(docx)ファイルから、指定の単語を含む行(パラグラフ)を抜き出して列挙します。
単にWordの機能で検索するよりは、ある単語がどういうところで使われているか、をまとめて取り出すのに便利かと思います。
cf. python wordgrep.py -f "path/filename.docx" -w "ほげほげ"
単語の指定には、正規表現が使えます。
PyInstaller で、windows 用実行ファイルを作成してあります(Windows10 検証済み)
仕組み
基本的な仕組みは簡単で、python-docx でWordファイルを読み込むと、1パラグラフごとに取得できるので、それを配列に入れて、その配列を正規表現でフィルタ(match)させるだけです。
コード
コマンドラインからの引数の設定など
from docx import Document
import sys
import argparse
import os
import re
# outline --help
parser = argparse.ArgumentParser(
description="Text extraction from Word(docx) files")
parser.add_argument(
'-f',
'--file',
type=str,
help='path\\filename.docx',
required=True)
parser.add_argument(
'-w',
'--word',
type=str,
help='search word(Regular expression enabled)',
required=True)
cmd_args = parser.parse_args()
file_path = cmd_args.file
メインの処理
def wordgrep(path, search_word):
lis = []
document = Document(path)
# 1パラグラフごとに配列に入れる
for i, p in enumerate(document.paragraphs):
i_text = str(i) + ' : ' + p.text
lis.append(i_text)
# 検索条件
pattern = ".*" + search_word + ".*"
# Match the above pattern using list comprehension
filtered_lis = [x for x in lis if re.fullmatch(pattern, x, re.IGNORECASE)]
# 結果の配列の表示
print('\n'.join(filtered_lis))
コマンドライン引数を処理する
if __name__ == '__main__':
if not file_path:
sys.exit('Arguments are too short')
else:
# 絶対パスへ変換
path = os.path.abspath(file_path)
# ファイルの存在有無
if not os.path.isfile(path):
sys.exit("I don't have that file.")
# .docxを想定している場合
if path.split(".")[-1] != "docx":
sys.exit("That's not the right extension!!!")
search_word = cmd_args.word
wordgrep(path, search_word)
実行ファイル化
このままでももちろん使えますが、一応、実行ファイル化しました。
pyinstaller wordgrep.py --onefile
実行例
C:\Users\xxx>wordgrep.exe -f "C:\Users\xxx\舞姫.docx" -w ベルリン
6 : 余は幼きころより厳《きび》しき庭の訓《おし》えを受けし甲斐《かい》に、父をば早く喪《うしな》いつれど、学問の荒《すさ》み衰うることなく、旧藩《きゅうはん》の学館にありし日も、東京に出でて予備黌《よびこう》に通いしときも、大学法学部に入《い》りし後も、太田豊太郎《おおたとよたろう》という名はいつも一級の首《はじめ》にしるされたりしに、一人子《ひとりご》の我を力になして世を渡る母の心は慰みけらし。十九の歳《とし》には学士の称を受けて、大学の立ちてよりそのころまでにまたなき名誉なりと人にも言われ、某《なにがし》省に出仕して、故郷なる母を都《みやこ》に呼び迎え、楽しき年を送ること三とせばかり、官長の覚え殊《こと》なりしかば、洋行して一課の事務を取り調べよとの命を受け、わが名を成さんも、わが家を興《おこ》さんも、今ぞとおもう心の勇み立ちて、五十を踰《こ》えし母に別るるをもさまで悲しとは思わず、はるばると家を離れてベルリンの都に来ぬ。
12 : 官長はもと心のままに用いるべき器械をこそ作らんとしたりけめ。独立の思想をいだきて、人なみならぬ面《おも》もちした る男をいかでか喜ぶべき。危うきは余が当時の地位なりけり。されどこれのみにては、なおわが地位を覆《くつがえ》すに足らざりけんを、日ごろ伯林《ベルリン》の留学生のうちにて、ある勢力ある一群《ひとむ》れと余との間に、おもしろからぬ関係ありて、かの人々は余を猜疑《さいぎ》し、またついに余を讒誣《ざんぶ》するに至りぬ。されどこれとてもその故なくてやは。
33 : このとき余を助けしは今わが同
(以下省略)
ヘルプ
一応ヘルプをつけました。
C:\Users\xxx>wordgrep.exe -h
usage: wordgrep.exe [-h] -f FILE -w WORD
Text extraction from Word(docx) files
options:
-h, --help show this help message and exit
-f FILE, --file FILE path\filename.docx
-w WORD, --word WORD search word(Regular expression enabled)
おわりに
ソース、実行ファイルとも以下に置きました。
https://github.com/wonox/wordgrep