Pythonでは、外部ライブラリのpython-docxを利用すると、Word文書(docxファイル)を操作できます。python-docxを使うことで、Wordを開かないでテキストを読み取ったり、編集するプログラムをPythonで作成できます。
今回はすぐ参考にできるように使い方の要点だけをまとめてみました。ぜひ日頃のプログラミングにご活用ください。
本記事の目次
python-docxのインストール方法
コマンドプロンプトを起動して以下のコマンドを入力するとインストールできます。
> py -m pip install python-docx
# アップグレードする場合
> py -m pip install python-docx -U
コマンドプロンプトは「Windowsキー()+ R 」を入力して表示される画面で「cmd」 と入力し OK をクリックすると開きます。
python-docx のPyPIページ
https://pypi.org/project/python-docx/
python-docx の公式ドキュメント
https://python-docx.readthedocs.io/
Word文書を開く、保存する方法
最初にimport docx
でpython-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")
Documentオブジェクトの公式リファレンス
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文書に含まれる段落、表、図(行内)の個数を調べる
>>> 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つ目の段落のように、インデントで字下げしている場合は先頭のスペースはないので取得されません。
Paragraphオブジェクトの公式リファレンス
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(実行結果)
特定の段落の前に段落(テキスト)を挿入する
>>> doc3 = docx.Document("Sample3.docx")
>>> last_para = doc3.paragraphs[-1] # 最後の段落
>>> last_para.insert_paragraph_before("・ 150は整数型なのでintになります。") # 段落を挿入
>>> doc3.save("Sample4.docx")
Sample4.docx(実行結果)
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つのかたまりになるように分割されます。
段落に含まれる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(実行結果)
Runオブジェクトの公式リファレンス
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
Tableオブジェクトの公式リファレンス
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(実行結果)
図[行内](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 になります。
InlineShapeオブジェクトの公式リファレンス
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(実行結果)
2. 画像を別ファイルで保存する
本記事の執筆時のバージョン(0.8.10)では、画像を別ファイルに保存する機能は確認できませんでした。しかし、docxファイルをZIP形式のファイルとして展開すると取り出すことができます。Pythonでプログラミングする方法は、以下の記事で詳しく説明しています。