Pythonでは、外部ライブラリのpython-docxを利用すると、Word文書(docxファイル)を操作できます。python-docxを使うことで、Wordを開かないでテキストを読み取ったり、編集するプログラムをPythonで作成できます。

今回はすぐ参考にできるように使い方の要点だけをまとめてみました。ぜひ日頃のプログラミングにご活用ください。

本記事の目次
本記事は、Windows10 + Python3.7 + python-docx0.8.10で動作を確認しています。

python-docxのインストール方法

コマンドプロンプトを起動して以下のコマンドを入力するとインストールできます。

> py -m pip install python-docx

# アップグレードする場合
> py -m pip install python-docx -U

コマンドプロンプトは「Windowsキー()+ R 」を入力して表示される画面で「cmd」 と入力し OK をクリックすると開きます。

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

https://python-docx.readthedocs.io/

Word文書を開く、保存する方法

最初にimport docxpython-docxをインポートします。import python-docxではないので気を付けてください。

>>> import docx

1. Word文書の読み込み

>>> doc = docx.Document("Sample.docx")

2. Word文書の新規作成

>>> doc = docx.Document()

3. Word文書の保存

# 上書き保存(読み込んだのと同じ名前を指定)
>>> doc.save("Sample.docx")

# 別名保存(読み込んだのと別名を指定)
>>> doc.save("Sample2.docx")

https://python-docx.readthedocs.io/en/latest/api/document.html

Word文書の構成

Wordで文章を書くときは、ひとまとまりの文章を入力したら、Enterキーを押して、次の「段落」に移動します。Wordでは、このように段落という「かたまり(ブロック)」を下に継ぎ足しながら全体の文書を作成します。「」や「」を入力したい場合は、段落の間や中に挿入します。

python-docxにおける「段落」「表」「図」

python-docxでは、「段落」はParagraphというデータで扱われます。「」は段落の間にTableというデータで挿入します。「」は、Wordでは行内、外周、前面など7種類の挿入方法がありますが、python-docxでは「行内」だけがサポートされ、InlineShapeというデータで扱います。

以下の簡単な例で見てみましょう。このように段落と表のブロックが組み合わさった構造になっています。段落は改行マークだけでも1つの段落になることに気を付けてください。

Sample.docx

Word Parts

Word文書に含まれる段落、表、図(行内)の個数を調べる
>>> import docx
>>> doc = docx.Document("Sample.docx")
>>> print("段落の個数:", len(doc.paragraphs))
段落の個数: 9
>>> print("表の個数:", len(doc.tables))
表の個数: 1
>>> print("図(行内)の個数:", len(doc.inline_shapes))
図(行内)の個数: 1

Wordにおける「改行マーク」の意味とは?

一般に改行を表すのに用いられる「改行マーク(↵)」は、Wordでは1つの段落の終わりを意味する「段落記号」として使われます。Wordの「段落」は「行」とは異なるので気を付けてください。

段落(Paragraph)の操作

1. すべての段落からテキストを取得する

Word文書に含まれるすべての段落のリストは、paragraphsで取得できます。段落に入力にされている「テキスト」はtextで得られます。

>>> import docx
>>> doc = docx.Document("Sample.docx")
>>> num = 0
>>> for para in doc.paragraphs:
        num = num + 1
        print(num, para.text)

1 Pythonのデータ型
2 Pythonで使用するデータは,必ず何らかのデータ型に属します。
3  データ型には様々な種類がありますが,基本となるのは以下の表の文字列型と数値型です。数値型は整数型と浮動小数点数型がおもに用いられます。
4 
5 
6  データ型は以下のようにtype()で調べることができます。
7 
8 
9 

なお、2つ目の段落のように、インデントで字下げしている場合は先頭のスペースはないので取得されません。

https://python-docx.readthedocs.io/en/latest/api/text.html

2. 特定の段落からテキストを取得する

特定の段落は、paragraphsからインデックス番号(0から始まる)で取得できます。

>>> para3 = doc.paragraphs[2] # 3つ目の段落を取得
>>> print(para3.text)
 データ型には様々な種類がありますが,基本となるのは以下の表の文字列型と数値型です。数値型は整数型と浮動小数点数型がおもに用いられます。

3. 段落のテキストを書き換える

段落の.textの値を差し替えれば、テキストを書き換えることができます。

>>> para2 = doc.paragraphs[1] # 2つ目の段落を取得
>>> t = para2.text
>>> t = t.replace("Python", "パイソン") 
>>> para2.text = t # 編集したテキストで差し替える
>>> doc.save("Sample2.docx")
Sample.docx、Sample2.docx(実行結果)

4. 段落(テキスト)を追加する

末尾に段落(テキスト)を追加する
>>> doc.add_paragraph('・ "Hello"は文字列型なのでstrになります。')
>>> doc.add_paragraph("・ 3.14は浮動小数点数型なのでfloatになります。")
>>> doc.save("Sample3.docx")
Sample3.docx(実行結果)

add paragraph

特定の段落の前に段落(テキスト)を挿入する
>>> doc3 = docx.Document("Sample3.docx")
>>> last_para = doc3.paragraphs[-1] # 最後の段落
>>> last_para.insert_paragraph_before("・ 150は整数型なのでintになります。") # 段落を挿入
>>> doc3.save("Sample4.docx")
Sample4.docx(実行結果)

insert paragraph

5. 段落の文字揃えを設定する

>>> from docx.enum.text import WD_ALIGN_PARAGRAPH
# 左に揃える
>>> para.alignment = WD_ALIGN_PARAGRAPH.LEFT 
# 中央に揃える
>>> para.alignment = WD_ALIGN_PARAGRAPH.CENTER 
# 右に揃える
>>> para.alignment = WD_ALIGN_PARAGRAPH.RIGHT 

6. 文字列のスタイルを変更する

段落はRunと呼ばれるかたまりに分割されます。Runは文字列にスタイルなどを適用できるように区切られるので、例えば以下のように文字列を太字にするとその文字列が1つのかたまりになるように分割されます。

Word Runs

段落に含まれるRunは、以下のようにrunsで取得できます。

>>> para3 = doc.paragraphs[2]
>>> num = 0
>>> for run in para3.runs:
        num = num + 1
        print(num, run.text)

1  
2 データ型には様々な種類がありますが,基本となるのは以下の表の
3 文字列型
4 と
5 数値型
6 です。数値型は整数型と浮動小数点数型がおもに用いられます。

Runには、.bold.italic.underline.fontでスタイルを設定できるので、太字を下線に変更するには以下のような簡単なコードで可能です。

>>> for run in para3.runs:
        if run.bold:
            run.bold = False
            run.underline = True

>>> doc.save("Sample5.docx")
Sample5.docx(実行結果)

Word Run Style Change

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

表(Table)の操作

Word文書に含まれるすべての表のリストはtablesで取得できます。表の「行」はrows、「列」はcolumnsで得られます。

>>> num = 0
>>> for tbl in doc.tables:
        num = num + 1
        print(num, "行数=", len(tbl.rows), "列数=", len(tbl.columns))

1 行数= 4 列数= 3

https://python-docx.readthedocs.io/en/latest/api/table.html

1. セルの値を取得する

>>> tbl = doc.tables[0]
>>> for row in tbl.rows:
        row_text = []
        for cell in row.cells:
            row_text.append(cell.text)
        print(row_text)

['分類', 'データ型', 'おもな用途']
['文字列型', 'str', '文字やテキスト']
['整数型', 'int', '個数や順番など']
['浮動小数点数型', 'float', '一般的な数値計算']

2. セルのスタイルを変更する

>>> tbl = doc.tables[0]
>>> header = tbl.rows[0] # 表の1行目
>>> for cell in header.cells:
        # セルの中の段落
        cell_para = cell.paragraphs[0]
        for run in cell_para.runs:
            if run.text:
                # 太字にする
                run.bold = True

>>> doc.save("Sample6.docx")
Sample6.docx(実行結果)

Word

図[行内](InlineShape)の操作

Word文書に含まれるすべての図(行内のみ)はinline_shapesで取得できます。図の「幅」はwidth、「高さ」はheightで得られます。

>>> num = 0
>>> for pic in doc.inline_shapes:
        num = num + 1
        print(num, "幅=", pic.width, "高さ=", pic.height)

1 幅= 5286375 高さ= 1971675

ここで、幅と高さの単位は、Emu(English Metric Units)が用いられています。Emuは画像のピクセルから、「Emu = ピクセル x 914400 / 96」 で換算できます。今回の例の画像は、幅が555ピクセルなので、555 x 914400 / 96 = 5286375 になります。

https://python-docx.readthedocs.io/en/latest/api/shape.html

1. 図のサイズを変更する

>>> img = doc.inline_shapes[0]
# widthとheightはint型なのでint()で変換
>>> img.width = int(img.width * 0.5)
>>> img.height = int(img.height * 0.5)
>>> doc.save("Sample7.docx")
Sample7.docx(実行結果)

Word Image Size Change

2. 画像を別ファイルで保存する

本記事の執筆時のバージョン(0.8.10)では、画像を別ファイルに保存する機能は確認できませんでした。しかし、docxファイルをZIP形式のファイルとして展開すると取り出すことができます。Pythonでプログラミングする方法は、以下の記事で詳しく説明しています。

no image
ワード文書(docxファイル)は、実は「ZIP形式」で圧縮されているので、拡張子を.zipに書き換えて解凍すると埋め込まれている画像ファイルを取得できます。 手作業では結構な手間になるので、今回…

あわせて読みたい

no image
Pythonでは、外部ライブラリのopenpyxlを利用すると、Excelファイル(*.xlsx)の読み書きやシート操作がきます。今回はプログラミング中に使い方をすぐ調べられるように簡単なコードだけで…
no image
パソコン操作を時短するには、まずは「マウスに触らないこと」です。つまり、キーボードで操作すれば、マウスに持ち替えてクリックしてという時間を省くことができます。 例えば、 コピー、ペースト…