概要
大量の文章ファイルを扱うとき、いちいち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)