エクセルを扱ったら次は当然アレをやらないといけないのでしょう。マイクロソフトのアレといえばワードです。つまりワードプロセッサ(すでに死語なのかも)です。会議や町内会に関する案内など各種連絡の通知用として幅広く使われています。他にも原稿の提出もワード、レポートも提出もワード、校正もワード、なんでもかんでもワードで、よろしくという世界。幅広く使われているワードが嫌いな人も多いようですが、ここでは好き嫌いに関係なくワードファイルを扱わざるを得なくなった場合に便利なPythonのライブラリを使います。ワードを使わずにワード文書の読み書きができればよいはずです。(OpenOffice系やそれなりのアプリを使うという方法もあります)
 Windowsだとワードがデフォルトという感じもあるので、そうでない環境のmacOSでプログラムを実行します。もちろんLinuxなども同様にプログラムを動作させることができます。今回使用するワードのサンプルファイルは以下のようになっています。実際にはワードファイルは多種多様で様々なところで使用されているため、実務で使用するには難しい面もあるかもしれません。それでも、他のコマンドと組み合わせて使うことができるので、役立つ場合があるかもしれません。

 なお、以後に説明するプログラムは上記のワードのドキュメントと同じ階層のディレクトリ(フォルダ)にあるものとします。もちろんプログラム内でワードファイルがあるファイルパスを指定すれば異なる場所にあっても問題ありません。

Pythonのライブラリをインストールする

 まず、ワードファイルを扱うライブラリをインストールします。使用するライブラリはpython-docxです。

python-docx
https://pypi.org/project/python-docx/

 ライブラリをインストールする方法は上記の公式サイトに掲載されているので、そのままターミナルから実行します。

 すでにライブラリがインストールされている場合は以下のようになります。

 python-docxライブラリのドキュメントは以下のページにあります。

python-docxライブラリのドキュメント
https://python-docx.readthedocs.io/en/latest/

 Pythonプログラム内でこのライブラリを使うには最初に以下の1行を入れるだけです。

import docx

 これでワードに関する各種処理を行うことができます。

ワード文書の最初の段落を表示

 まず簡単なところでワードの文書の最初の段落を表示してみます。エクセルはセル単位で処理しますが、ワードは段落単位で処理します。ワードでの段落情報はparagraphsに入っています。段落へのアクセスはparagraphs[番号]のように指定します。番号ですが、最初の段落が0になります。2番目の段落は1、3番目の段落は2のようになります。
 段落の文字は色がついていたりサイズが指定されていたりしますが、プレーンなテキスト(純粋な文字のみ)はtextに入っています。
 最初の段落の文字を表示するプログラムは以下のようになります。なお、最初にも書きましたが、このPythonのプログラムはsample1.docxファイルと同じディレクトリ(フォルダ)に入れておく必要があります。

import docx
doc = docx.Document("sample1.docx")
text = doc.paragraphs[0].text
print(text)

 次に5番目の段落の内容を表示してみます。doc.paragraphs[0]の0を4にするだけです。実際のプログラムは以下のようになります。実行すると5番目の段落内容が表示されます。

import docx
doc = docx.Document("sample1.docx")
text = doc.paragraphs[4].text
print(text)

任意のファイルの任意の段落内容を表示

 次に任意の段落の内容を表示してみます。ついでにワードファイルも指定できるようにします。コマンドラインからの引数に段落番号を指定するようにします。コマンドラインで入力した引数を扱う場合はimport sysを追加します。エクセルの時にも使いましたので、詳しくはそちらの回を参照してください。
 コマンドラインでは以下のように指定するものとします。rw3.pyは以下で実行するプログラムのファイル名です。

python rw3.py ワードファイルのパス 段落番号

 ワードファイルのパスはsys.argv[1]に、段落番号はsys.argv[2]に入ります。ファイルパスは文字列のままで問題ありませんが、段落番号は数値にする必要があります。コマンドラインから入力された状態では文字列なので、そのまま指定するとエラーになってしまいます。そこでint()を使って整数値に変換します。
 実際のプログラムは以下のようになります。指定したワードファイルの段落内容が表示されます。なお、存在しない段落番号を指定するとエラーになります。エラー処理に関しては最後に説明します。また、表組の段落は別扱いなので指定しても表示されません。

import sys
import docx
doc = docx.Document(sys.argv[1])
idx = int(sys.argv[2])
text = doc.paragraphs[idx].text
print(text)

全ての段落を表示

 特定の段落ではなくてワード文書全体の段落の文字を表示してみます。段落の数だけ繰り返すにはforを使います。実際のプログラムは以下のようになります。

import sys
import docx
doc = docx.Document(sys.argv[1])
for p in doc.paragraphs:
  print(p.text)

全文表示できればgrepで検索することもできます。grepなどを使えるのでこれだけでもかなり便利になるかもしれません。ただし、表内の文字は上記のプログラムでは出力されないので、その点には注意する必要があります。

文字サイズを表示

 ワード文書から大きな見出しの文字だけ抜き出したい場合もあります。というのも先ほどの段落番号を指定する方法では、あらかじめ対象となる文書の内容がわかっていないといけません。ワード文書の場合、だいたい見出しは大きな文字サイズになってる事が多いのではないでしょうか。私のところにやってくるワード文書はそんな感じですし、ネット上にあるテンプレートもそんな感じになっています。
 ということで今度は一定の文字サイズ以上ならテキストを表示するようにしてみます。
 使用するライブラリではサイズや文字装飾に関するデータはRunオブジェクトに格納されるとあります。(下記URL)

Run objects
https://python-docx.readthedocs.io/en/latest/api/text.html#run-objects

 確認のため指定したワードファイルの指定した段落の文字サイズを表示するプログラムを用意します。なお、文字サイズは内部の値になっているのでポイント値にするには以下のようにptをつけます。実行すると文字サイズとptに変換した文字サイズが表示されます。

import sys
import docx
doc = docx.Document(sys.argv[1])
idx = int(sys.argv[2])
p = doc.paragraphs[idx]
print(p.runs[0].font.size)
print(p.runs[0].font.size.pt)

 これでサイズに応じて処理できそうですが、文字がない段落ではエラーが発生してしまいます。

 ワードには空欄の段落も多くあるので、先ほどのプログラムではエラーが多発して使いものにならないでしょう。そこでエラー対策をすることにします。Python言語は、それなりに古いので定番のtryを使って処理することができます。try:の次の行から1段階字下げして(インデントして)エラーが発生する可能性がある処理を書きます。そして、except以後で発生したエラーに応じて処理を行います。今回発生するエラーはIndexErrorなので、その対処を書きます。対処といっても何も出力しないようにprint(end='')を書くだけです。なお、エラーが発生しているかどうか確認(デバッグ)する場合は、ここで何かエラーに関する情報を出力すればよいでしょう。
 実際のプログラムは以下のようになります。前のプログラムではエラーになっていた行も、このプログラムではエラーなく終了しています。

import sys
import docx
doc = docx.Document(sys.argv[1])
idx = int(sys.argv[2])
p = doc.paragraphs[idx]
try:
  print(p.runs[0].font.size)
  print(p.runs[0].font.size.pt)
except IndexError as e:
  print(end='')

 エラーが出なくなればあとは指定したワードファイルの段落の文字サイズを読み出して指定したサイズ以上であれば表示します。以下のプログラムでは12.0より大きいサイズの段落の文字を表示します。なお、段落内でいろいろな文字サイズがある場合、最初の文字サイズのみを対象にしています。  プログラムを実行すると指定したワードファイルで文字サイズが12.0より大きい段落の文字だけが表示されています。

import sys
import docx
doc = docx.Document(sys.argv[1])
for p in doc.paragraphs:
  try:
    n = p.runs[0].font.size.pt
    if n>12.0:
      print(p.text)
  except IndexError as e:
    print(end='')
  except AttributeError as e:
    print(end='')

段落の文字が太字(ボールド)の場合のみ表示

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら