派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

Python×Word:複数のWordファイルを一括編集してみよう

Pythonを実際に動かしてみよう!今回のお題は、Python×Word。ビギナーも取り掛かりやすい、サンプルコードとライブラリをご紹介します。【読むだけでも、なるほど】と思っていただけるよう、関連トピックも多く記載。プログラムでWordファイルを一括編集する方法をぜひ習得してみてください。

また、本記事のご感想をお送りいただいた方に、抽選で書籍『いきなりプログラミングPython(翔泳社)』をプレゼント。詳細は記事の最後に。

【筆者】 watさん
メーカー勤務機械系エンジニア。WATLABブログ運営者。工学計算に関する知識の習得を目指し、Pythonの学習を2019年から始める。仕事以外にも、趣味のプログラミングやPythonコミュニティへの参加を行っている。また、月間数万PVのPythonブログ「WATLAB」を立ち上げ、初心者向けに図を多くしたわかりやすい記事を作成・公開している。著書は『いきなりプログラミング Python』(翔泳社)。
ブログ:https://watlab-blog.com/
 

1.「面倒だな」と思ったらプログラミングで解決しよう

現代ではどんな仕事をしていても文章を書く業務が少なからずあります。ソフトウェアの仕様を説明するドキュメント、人に業務を教えるためのマニュアル…など、その種類は多岐にわたります。文章を書くツールもさまざまありますが、Microsoft Excelを使っている会社は同じOffice製品であるWordを使うことが多いのではないでしょうか。

Word業務の中でも「文字列の置換」は使用頻度の高い操作です。単一のWordファイルであれば、Word標準の機能を使って文書内の文字列を置換できますが、大量のファイルを一括で置換するには少し工夫が必要です。

この記事ではPythonを使って複数のWordファイル内文字列を一括で置換する方法を紹介します。PythonでWordを編集する方法の第1歩として、PCをお持ちの方はぜひ実際にコードを実行してみてください。

2. Pythonプログラミングの準備

■Pythonプログラミング環境の構築

Pythonプログラミングの環境は「最速でPython環境を構築してプログラミングをはじめよう」を参照してください。リンク先にはPythonのインストール方法、プログラムの記述・実行方法、外部ライブラリのインストール方法をまとめています。

▼Pythonのインストールがまだの方はこちらから!

■必要なライブラリのインストール

POINT
第0回:最速でPython環境を構築してプログラミングをはじめよう」から始める方は、JupyterLabを立ち上げる前の状態にしておきましょう(仮想環境を使わない場合は5節、仮想環境を使う場合は7節の、いずれもjupyter labコマンドを実行する手前)。

(1)python-docx

python-docxは、PythonでWordファイルを作成・編集するための外部ライブラリです。.docxファイルを操作するためには次のコマンドでインストールします。

pip install python-docx

外部ライブラリのインストールが終了したら、以下のコマンドを入力して、JupyterLabを立ち上げましょう。立ち上がったらNotebookと書かれている下のアイコンをクリックします。

jupyter lab

3. サンプルファイル

この記事のコードをすぐに試せるように、3種類の.docxファイルをサンプルとして用意しました。手元にWordのファイルがない場合は以下のリンクからダウンロードしてお使いください。

▼クリックするとWordファイルがダウンロードされます。
■sample1
https://www.r-staffing.co.jp/rasisa/wp-content/uploads/2025/02/sample1.docx
■sample2
https://www.r-staffing.co.jp/rasisa/wp-content/uploads/2025/02/sample2.docx
■sample3
https://www.r-staffing.co.jp/rasisa/wp-content/uploads/2025/02/sample3.docx

サンプルファイルの中身は次の通りです。いずれも異なる「技術」について書かれている短い文章です。

◼️sample1.docx
Wordドキュメント1
現代の情報技術は、社会のあらゆる分野に革命をもたらしています。人工知能やビッグデータ解析などの技術は、ビジネスの効率化や新しいサービスの創出に貢献しています。これらの技術を適切に活用することで、持続可能な社会の実現が期待されています。
 
◼️sample2.docx
Wordドキュメント2
医療分野における技術の進歩は、患者の治療法や診断方法を大きく変えています。遺伝子編集技術やロボット手術など、最新の医療技術は、これまで不可能だった治療を可能にし、患者の生活の質を向上させています。技術の発展は健康な未来への鍵となります。
 
◼️sample3.docx
Wordドキュメント3
環境問題に対処するためのクリーンエネルギー技術が注目されています。太陽光発電や風力発電などの再生可能エネルギー技術は、化石燃料に依存しない持続可能なエネルギー供給を目指しています。これらの技術の普及は、地球温暖化の抑制に重要な役割を果たします。

4. まずはWordファイルを開いてみる

まずはWordのファイルである.docxを開いて中身を確認します。 次のコードを書いて実行してみましょう。

from docx import Document

# ファイル名を指定してWordファイルを読み込む
input_path = 'sample1.docx'
doc = Document(input_path)

# ドキュメントのすべての段落を表示
for para in doc.paragraphs:
    print(para.text)

コードを実行するとファイル名で指定した「sample1.docx 」の中身が出力されます。

POINT
1〜5行目:import文とドキュメントの読み込み
1行目はさきほどインストールしたpython-docxという外部ライブラリを使うためのimport文です。Pythonでは標準ライブラリ(インストール不要のライブラリ)と外部ライブラリ(標準ライブラリ以外)はともにimportしてから本文で呼びだすという使い方をします。5行目のDocument()はimportをしてはじめて使える機能で、Wordドキュメントの読み込みをしている部分です。
 
POINT
8〜9行目:ドキュメントのすべての段落を表示
forは繰り返し処理を行うときに使用します。inは「〜の中に」という意味ですが、ここではdoc.paragraphsで.docxの中のすべての段落の中身を、paraという新しい変数に格納して1つずつループを回すという処理がされます。その結果をprint()で表示させますが、9行目に半角スペース4つ分の「インデント(字下げ)」があることに注意しましょう。
Pythonのforループはこのインデントされた部分が繰り返し処理されます。

5. 単一のWordファイル内の文字を置換してみよう

ドキュメントの読み込みができたので、早速文字列の置換をしてみましょう。「技術」という単語を「テクノロジー」に変換するために、次のコードの修正を行います。

from docx import Document

# ファイル名を指定してWordファイルを読み込む
input_path = 'sample1.docx'
doc = Document(input_path)

# 置換する文字列                # ここから追加
replace_target = '技術'
replace_with = 'テクノロジー'   # ここまで追加

# 置換処理(コメント変更)
for para in doc.paragraphs:
    if replace_target in para.text:       # 追加
        para.text = para.text.replace(replace_target, replace_with)                                # 追加
    print(para.text)
 
POINT
7〜9行目:置換する文字列の設定
replace_targetが元の文章で変更したい単語、replace_withが変換後の単語です。他の単語を置換したい場合はこの部分を変更してください。
 
POINT
13〜14行目:置換処理
paraには段落のテキスト情報が1つずつ格納されていますが、「もしparaのテキストの中に、置換対象の文字replace_targetがあったら」14行目の置換処理が実行されます。ifは条件に一致した場合のみ処理を実行する制御文です。forと同様にインデントのついている行が対象になることに注意してください。

ここで実行結果を確認してみましょう。コードを実行すると次の文章が出力されているはずです。プログラムで指定した通り、「技術」が「テクノロジー」に置換されていますね。

「現代の情報テクノロジーは、社会のあらゆる分野に革命をもたらしています。人工知能やビッグデータ解析などのテクノロジーは、ビジネスの効率化や新しいサービスの創出に貢献しています。これらのテクノロジーを適切に活用することで、持続可能な社会の実現が期待されています。」

6. プログラムを関数化しよう

非常に簡単なコードでWordファイルを開き、単語の置換ができました。ここまでで基本的な置換プログラムは完了してしまいましたので、あとは複数ファイルへこの処理を適用させることができれば完成です。ただし、上記コードをファイル名を変えて何回も書くというのはナンセンス。

Pythonに限らず、プログラミングでは同じ処理をできるだけ書かないようにするのが一般的です。そのために今回はさきほどまでのコードを関数で書き換えます。

次のコードはこれまでのコードを全体的に関数に書き換えたものです。

from docx import Document

def docx_replace_text(input_path, replace_target, replace_with):
    """.docxファイル内の文字列を置換する関数"""

    # ファイル名を指定してWordファイルを読み込む
    doc = Document(input_path)

    # 置換処理
    for para in doc.paragraphs:
        if replace_target in para.text:
            para.text = para.text.replace(replace_target, replace_with)
        print(para.text)

    return

# ファイルのパスと置換する文字列
input_path = 'sample1.docx'
replace_target = '技術'
replace_with = 'テクノロジー'

# 関数の実行
docx_replace_text(input_path, replace_target, replace_with)
 
POINT
3〜15行目、17〜23行目:関数化
Pythonでは関数をdefキーワードで記述します。この場合、関数名がdocx_replace_textです。そして関数の引数にinput_path, replace_target, replace_withを設定し、関数の中で使っています。
17〜23行目は必要な設定を準備して関数を実行する部分です。あとは関数を好きなタイミングで呼び出し、引数を変更しながら使えば同じコードを何回も書かなくてよくなります。

7. 複数のWordファイルに対応させよう

複数のファイルを一括編集する処理を書くとき、その複数のファイルをすべて手入力していては本末転倒です。プログラム実行フォルダに入っているすべての.docxファイルをリストにする処理を追加しましょう。ファイルのパスを操作するにはpathlibというPython標準ライブラリを使用するのが一般的です。

次のコード修正を行います。ここではPath.cwd()でプログラム実行フォルダの場所を取得し、.glob(*.docx)でそこにある.docxファイルのみをすべて取得しています。この段階でinput_pathの行は削除しておきます。そして関数を実行する部分で取得した.docxのファイルを1つずつforで処理します。

from docx import Document
from pathlib import Path    # 追加

def docx_replace_text(input_path, replace_target, replace_with):
    <省略>
    return

# 置換する文字列
input_path = 'sample1.docx'    # 削除
replace_target = '技術'
replace_with = 'テクノロジー'

# プログラム実行フォルダ内の.docxファイルをリストする    # ここから追加
current_dir = Path.cwd()
docx_files = list(current_dir.glob("*.docx"))    # ここまで追加

# 関数の実行
for input_path in docx_files:                                   # 追加
    docx_replace_text(input_path, replace_target, replace_with) # インデントを追加

このコードを実行する場合、あらかじめ置換処理したいすべての.docxファイルをプログラム実行フォルダに置いておいてください。

コードを実行すると置換処理後のテキストがファイル数の数だけ出力されます。

8. ファイルを保存しよう

あとは置換後の.docxファイルを保存すれば完了です。同じ場所にファイルを保存してしまうと元のファイルが上書きされてしまったり、同じようなファイル名が隣り合って紛らわしくなったりするため、保存するファイルは別でフォルダを作成するという処理も追加します。

次のコードを追加しましょう。

from docx import Document
from pathlib import Path

def docx_replace_text(input_path, output_path, replace_target, replace_with): # output_pathを追加
    """.docxファイル内の文字列を置換する関数"""
    <省略>
        print(para.text)

    # ファイルを保存する     # 追加
    doc.save(output_path) # 追加

    return

<省略>
docx_files = list(current_dir.glob("*.docx"))

# 出力フォルダを作成(存在しない場合のみ)    # ここから追加
output_dir = current_dir / "replaced"
output_dir.mkdir(exist_ok=True)        # ここまで追加

# 関数の実行
for input_path in docx_files:
    output_path = output_dir / input_path.name  # 追加
    docx_replace_text(input_path, output_path, replace_target, replace_with)                          # output_pathを追加
POINT
30〜32行目:出力フォルダを作成
31行目はすでに取得済の現在のフォルダcurrent_dirと「replaced」という文字列を使ってパスの連結を行っています。32行目の.mkdir()でreplacedというフォルダを作成します。.mkdirの引数であるexist_okTrueにしておくことで、replacedフォルダが存在しない場合のみ新規フォルダを作成するという動作をします。
 
POINT
4行目、36〜37行目:保存先の引数を設定
保存先をreplacedというフォルダにして元のファイルと分ける構想なので、ファイル名は元のファイルをそのまま使います。まずはoutput_pathという保存ファイルのパスを関数の引数に新規設定します(4行目と37行目)。このoutput_path(36行目)は元のファイルの名前(input_path.name)を再利用して保存先をreplacedフォルダにしたものです。
 
POINT
17行目:ファイル保存
関数の中で.docxファイルを保存します。関数が呼びだされる度に、input_pathoutput_pathの内容が変わるので毎回新しいファイルが作成されます。

9. 全体のコードはこちらから

この記事ではPythonでWordを制御する方法とともに、簡単なファイル処理の方法も学びました。ただし、分量の都合から基本的な内容のみに絞っています。

そしてこのプログラムはまだまだ改良の余地があります。万能な置換処理プログラムにするためには、表やテキストBoxの文章も置換できるようにするのが良いでしょう。

今回は「段落」の文章のみ置換処理の対象としています。表やテキストBox内の文章も取得するように改良することでより汎用的なプログラムになるでしょう。python-docxライブラリの公式ページにはさまざまなAPIが公開されているので、Pythonに興味を持った方は是非挑戦してみてください。

python-docx公式ドキュメント:https://python-docx.readthedocs.io/en/latest/

from docx import Document
from pathlib import Path

def docx_replace_text(input_path, output_path, replace_target, replace_with):
    """.docxファイル内の文字列を置換する関数"""

    # ファイル名を指定してWordファイルを読み込む
    doc = Document(input_path)

    # 置換処理
    for para in doc.paragraphs:
        if replace_target in para.text:
            para.text = para.text.replace(replace_target, replace_with)
        print(para.text)

    # ファイルを保存する
    doc.save(output_path)

    return

# 置換する文字列
replace_target = '技術'
replace_with = 'テクノロジー'

# プログラム実行フォルダ内の.docxファイルをリストする
current_dir = Path.cwd()
docx_files = list(current_dir.glob("*.docx"))

# 出力フォルダを作成(存在しない場合のみ)
output_dir = current_dir / "replaced"
output_dir.mkdir(exist_ok=True)

# 関数の実行
for input_path in docx_files:
    output_path = output_dir / input_path.name
    docx_replace_text(input_path, output_path, replace_target, replace_with)

また、Excelの表に置換したい単語リストを記入しておき、異なる複数の置換処理を一括で行うプログラムに改良しても良いかもしれません。Pythonはとても書きやすい言語です。あなたの無限のアイデアを具現化してみてください。

Python×Excelが気になる人はこちらも

10. 書籍をプレゼント!

アンケートにご協力いただいた方の中から抽選で書籍『いきなりプログラミングPython(翔泳社)』をプレゼントします。その名の通り、「いきなり」作りはじめる入門書!ご応募お待ちしています。

プレゼントの応募詳細
■応募締め切り
2025年4月9日(水)まで
 
■応募条件
リクルートスタッフィングにご登録いただいている方が対象となります。
 
■応募方法
こちらよりご応募ください。
・ご応募は期間中お1人様1回限りとなります。ご了承ください。
 
■注意事項
・リクルートスタッフィングのご登録情報と応募時にご入力いただく【氏名】【スタッフNo.】【メールアドレス】【生年月日】の4点が一致していない場合は、抽選の対象外となります。ご登録情報のご確認は、MyPageよりお願いしております。
・当選者の発表は、賞品の発送をもって代えさせていただきます。賞品の発送は、締め切り後1ヶ月以内にお送りいたしますが、諸事情によりお時間をいただく場合もございます。ご了承ください。
・賞品は、MyPageにご登録の「住所」にお送りいたします。変更がある場合は、締め切りの2025年4月9日(水)までに「登録情報の確認・変更」よりお手続きをお願いいたします。
・個人情報やご登録状況、抽選の結果、賞品発送状況に関するお問い合わせは、お答えいたしかねます。
・ご回答いただいた内容は、「エンジニアスタイル」の企画のみに使用いたします。就業状況などに影響することはございません。

※本記事に記載されている会社名、製品名はそれぞれ各社の商標および登録商標です。

リクルートスタッフィング