Pythonでword,docxファイルを操作・置換する(python-docx)

概要

大量の文章ファイルを扱うとき、いちいちwordを使ってdocxの中身を変更するのは面倒。
Pythonを使ってある程度自動化できないか・・・と考えて調査したところ、簡単に実装できたのでまとめておく。

python-docxの導入

pythonを使ってdocxファイルを取り扱うために、python-docxというライブラリが公開されているので、まずはこれを導入する。
導入方法はpipを使うだけ。シンプル。

pip install python-docx

置換プログラム

ライブラリが導入できたら、以下のようなコードを実行することで、置換前の文字列を置換後の文字列に置換できる。
これを応用することで、wordを使った単調作業の一部を、自動化できるはず・・・。
汎用性の高い形にできたら、改めて公開したい。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from docx import Document

document = Document("before.docx"')

for paragraph in document.paragraphs:
    paragraph.text = paragraph.text.replace(u"置換前",u"置換後")

document.save("after.docx")

上記プログラムのGUIツール化

勉強がてら、tkinterを使ってGUIも作成してみた。
GUIで置換前、置換後のテキストを入力し、「docxファイル選択&変換」ボタンを押して変換したいファイルを指定すると、ファイル名_replace.docxという置換されたファイルが保存される。

#!/usr/bin/env python
# -*- coding: utf8 -*-
import sys
import Tkinter
import tkMessageBox
import tkFileDialog
from docx import Document


root = Tkinter.Tk()
root.title(u"docx置換ツール")
root.geometry("300x120")

def inputValue(event):
    before = EditBox_before.get()
    after = EditBox_after.get()

    fTyp=[('wordファイル',"*.docx")]

    iDir='c:/'
    filename=tkFileDialog.askopenfilename(filetypes=fTyp,initialdir=iDir)

    document = Document(filename)

    for paragraph in document.paragraphs:
        paragraph.text = paragraph.text.replace(before,after)


    document.save(filename.replace(u".docx","_replace.docx"))

    tkMessageBox.showinfo('変換完了')


# 置換前
# ラベル
Static1 = Tkinter.Label(text=u'置換前テキスト')
Static1.place(x=0, y=10)
# エントリー
EditBox_before = Tkinter.Entry(width=20)
#EditBox.insert(Tkinter.END,"挿入する文字列")
EditBox_before.place(x=100, y=10)

# 置換後
# ラベル
Static2 = Tkinter.Label(text=u'置換後テキスト')
Static2.place(x=0, y=40)
# エントリー
EditBox_after = Tkinter.Entry(width=20)
#EditBox.insert(Tkinter.END,"挿入する文字列")
EditBox_after.place(x=100, y=40)


#ボタン
Button = Tkinter.Button(text=u'docxファイル選択&変換', width=20)
Button.bind("<Button-1>",inputValue)
Button.place(x=20, y=70)

root.mainloop()

注記

ヘッダー、フッター、表の中の文章は置換できない可能性あり。
特殊な場所の文字列を置換したい場合は、以下のようにすることで、構造体の中身のメンバが確認できるので、適宜必要な箇所を指定すること。

import inspect

# documentの読み込み

print inspect.getmembers(document)