元セブ島在住のエンジニアの僕「Tommy」が、プログラミング・英語・セブ事情を発信するブログ

Tommy's blog

【Python】Word(ワード)を操作する【→業務効率UP】

9月 10, 2019

プログラム女子
会社でワードの編集を任されたんだけど、大量のファイルがあって...ワードの編集をプログラムで自動化できないかな?
できるよ。Pythonにはワードを編集するためのライブラリがあるんだ。今回はそれを使って、ワードの編集する方法を説明するね。
Tommy

この記事で分かること

  • PythonプログラムでWord(ワード)を自動で作成する方法が分かる
  • PythonプログラムでWord(ワード)を自動で読み取る方法が分かる

PythonでWord(ワード)を操作する概要

この記事では、Pythonを使ったワード(Word)ファイルの作成方法と読み込み方法説明します。これによって、業務の中でワードを作成する機会があった場合に、あるデータに基づいて自動的にワードファイルを編集することができます。

PythonでWord(ワード)操作する前提環境

ワード(Word)を操作する前提の環境は、下の記事で説明している私の環境と同じ環境で確認しています。

レンタルサーバなどのLinuxサーバを使っている場合は、下の記事でプログラミングする環境の作り方を説明しています。もし、まだプログラムする環境ができていない方は、先にこちらの記事を読んで、プログラミングできる環境をつくることをおすすめします。

PythonでWord(ワード)を操作するサンプルプログラム

ここでは、ワードファイルを作成する関数と、ワードファイルを読み込む関数を定義して、それらを実行するサンプルプログラムを説明します。サンプルプログラムは大きく下記のような項目で説明します。

  1. ライブラリをインポート
  2. ワードファイルの作成
  3. ワードファイルの読み取り

1.ライブラリのインポート

まずは、ワードを扱うためのライブラリ「docx」をインポートします。

import docx

ライブラリ「docx」をインポートする。

2.ワードファイルの作成

ここでは、ワードファイルを作成する方法を説明します。ワードの作成には次の手順を行います。

  • ワードオブジェクトを作成する
  • パラグラフを追加する
  • パラグラフオブジェクトを取得する
  • テキストをパラグラフに追加する
  • ワードファイルを保存する

上記の手順それぞれに関数を定義しているので、それらの処理内容を下記で説明します。

ワードオブジェクトを作成する

まず、ワードオブジェクトを作成する関数「create_docx」を定義します。ライブラリ「docx」の「Document」という関数を呼び出すと、ワードのオブジェクトが作成されます。作成したワードオブジェクトを戻り値として返却します。

# create docx
def create_docx():

	doc = docx.Document()
	return doc

  1. 関数「create_docx」を定義宣言する。
  2. 変数「doc」をライブラリ「docx」の関数「Document」から返却されるワードオブジェクトで初期化する。
  3. 変数「doc」を戻り値として返却する。

パラグラフを追加する

ここでは、パラグラフを追加する関数「add_paragraph」を定義します。引数に、ワードオブジェクトの引数「docx_object」と追加したい文字列の引数「text」を取り、「text」で指定された文字列の入ったパラグラフが、「docx_object」のワードオブジェクトに追加されます。

# add paragraph
def add_paragraph(docx_object,text):

	docx_object.add_paragraph(text)

  1. 関数「add_paragraph」を定義宣言する。
  2. 引数で得られたワードオブジェクト「docx_object」に対して関数「add_paragraph」を呼び出す。

パラグラフオブジェクトを取得する

パラグラフオブジェクトを取得する関数「get_paragraph_object」を定義します。

関数「get_paragraph_object」はワードオブジェクトの変数「docx_object」と取得したパラグラフオブジェクトの順番を表す変数「count」を引数に取り、指定された順番のパラグラフオブジェクトを返却します。

エラー処理として、「count」に負の値を入力されたり、ワードオブジェクトに存在しない数の番号が入力されると「None」を返却するようにしています。

# get paragraph object
def get_paragraph_object(docx_object,count):

	if (count > 0) and (len(docx_object.paragraphs) > count):
		return docx_object.paragraphs[count]
	else:
		return None

  1. 関数「get_paragraph_object」を定義宣言する。
  2. 変数「count」が 0よりも大きく、かつ 変数「docx_object」に存在するパラグラフ数「paragraphs」が変数「count」よりも大きい場合は以下の処理を実行する。
    1. 変数「docx_object」の「count」番目のパラグラフ「paragraphs」を返却します。
  3. 以外の場合は、以下の処理を実行する。
    1. 「None」を返却します。

テキストをパラグラフに追加する

既存のパラグラフにテキストを追加する関数「add_text」を定義します。

引数に既存のパラグラフオブジェクト「paragraph_object」と追加する文字列の変数「text」を入力(引数)とし、パラグラフオブジェクトで指定されたパラグラフに変数「text」で指定された文字列を追加します。

# add text to paragraph
def add_text(paragraph_object,text):

	paragraph_object.add_run(text)

  1. 関数「add_text」を定義宣言する。
  2. 引数で得たワードパラグラフのオブジェクト「paragraph_object」の関数「add_run」を呼び出す。

ワードファイルを保存する

ワード保存するために、「save_docx」という関数を定義します。ワードオブジェクトが格納された変数「docx_object」とファイル名が格納された変数「file_name」を引数に取り、ファイル名「file_name」で指定されたファイル名のワードを保存します。

# save docx
def save_docx(docx_object,file_name):

	docx_object.save(file_name)

  1. 関数「save_docx」を定義宣言する。
  2. 引数で得たワードオブジェクト「docx_object」の関数「save」を呼び出す。

定義した関数の実行(ワードフアイルの作成)

今回作成するサンプルプログラムでは、大きく下記のような種類の処理で、ワードファイルを作成しています。

  • ワードオブジェクトを作成
  • パラグラフの追加
  • パラグラフに文字列を追加
  • ワードファイルの保存
if __name__ == '__main__':

	# set file name
	filename = 'test.docx'

	# create docx object
	doc_obj = create_docx()

	# add paragraph
	add_paragraph(docx_object=doc_obj,text='Hello Team!')
	add_paragraph(docx_object=doc_obj,text='python')
	add_paragraph(docx_object=doc_obj,text='java')
	add_paragraph(docx_object=doc_obj,text='c#')

	# add text to paragraph
	paragraph_obj = get_paragraph_object(docx_object=doc_obj,count=3)
	if paragraph_obj != None:
		add_text(paragraph_object=paragraph_obj,text="+add text")

	# save docx file
	save_docx(docx_object=doc_obj,file_name=filename)

  1. 変数「filename」を文字列 「test.docx」で初期化する。
  2. 変数「doc_obj」を関数「create_docx」の戻りで初期化する。
  3. 引数にワードオブジェクト「doc_obj」と文字列「Hello Team!」を指定して、関数「add_paragraph」を呼び出す。
  4. 引数にワードオブジェクト「doc_obj」と文字列「python」を指定して、関数「add_paragraph」を呼び出す。
  5. 引数にワードオブジェクト「doc_obj」と文字列「java」を指定して、関数「add_paragraph」を呼び出す。
  6. 引数にワードオブジェクト「doc_obj」と文字列「c#」を指定して、関数「add_paragraph」を呼び出す。
  7. パラグラフオブジェクトを入れる為の変数「paragraph_obj 」を関数「get_paragraph_object」から返却される戻り値で初期化する。
  8. もし「paragraph_obj」が「None」ではない場合は以下の処理を実行する。
    1. 引数にパラグラフオブジェクト「paragraph_obj」と文字列「+add text」を指定して、関数「add_text」を呼び出す。
  9. 引数にワードオブジェクト「doc_obj」とファイル名の変数「filename」を指定して、関数「save_docx」を呼び出す。

3.ワードファイルの読み取り

次に、作成したワードファイルのデータ読み込みを行います。ワードファイルからのデータ読み込みは下記の順番で説明します。

  • ワードファイルを読み取る関数の定義
  • 定義した関数の実行

ワードファイルを読み取る関数の定義

ここでは、ワードデータ読み取りのために、「read_docx」という関数を定義します。既に作成されたワードファイルの名前の変数「file_name」を引数に取り、ワードファイルのすべてのパラグラフの文字列を配列「extracted_text」に格納して返却します。

# read docx
def read_docx(file_name):

	extracted_text = []

	doc = docx.Document(file_name)
	for value in doc.paragraphs:
		extracted_text.append(value.text)

	return extracted_text

  1. 関数「read_docx」を定義宣言する。
  2. 変数「extracted_text」 を空のリストで初期化する。変数「doc」をライブラリ「docx」の関数「Document」からの戻り値で初期化する。
  3. 「doc.paragraphs」にある複数のパラグラフを1つずつ「value」に格納しながら、以下の処理を繰り返す。
    1. 変数「extracted_text」の関数「append」を呼び出す。
  4. 変数「extracted_text」を戻り値として返却する。

定義した関数の実行

最後に、上記で定義したワードを読み取る関数「read_docx」の呼び出しを行います。読み取るワードファイルは上記で作成した「test.docx」を対象しています。

if __name__ == '__main__':

	# set file name
	filename = 'test.docx'

	# read docx
	extracted_text = read_docx(file_name=filename)

	print(extracted_text)

  1. 変数「filename」を文字列「test.docx」で初期化する。
  2. 変数「extracted_text」を関数「read_docx」に引数「filename」を指定した時の戻り値で初期化する。
  3. 変数「extracted_text」の内容を表示する。

Pythonで行うその他のofficeの操作方法

ワード(Word)ファイル以外にも、officeには、それぞれ異なる操作方法があります。

下記の記事では、普段の業務で使える、office(パワーポイント、エクセル、ワード)のPythonのプログラムによる操作方法を説明しています。

officeそれぞれの操作方法を、下記の記事を参考に、ご自身のプログラムを作成してみてください。

Pythonで業務効率化するその他の方法

この記事では、Pythonを使ったワード(Word)ファイルの作成方法と読み込み方法説明しました。

これによって、業務の中でワードを作成する機会があった場合に、あるデータに基づいて自動的にワードファイルを編集できることを説明しました。

ワード(Word)ファイルの作成方法と読み込み方法以外にも、Pythonには、業務効率化できる手段がたくさんあります。

下記の記事に、普段オフィス環境で使われるツールを使って業務効率化できる方法をまとめていますので、ぜひ合わせて読んで取り組んでみてください。