恒例行事の場合、書類はたいてい昨年度のものを、〇〇年度を新しくして使いまわします。
今回はそこを⾃動化してみましょう。⽂書の中の⽂字も、ファイル名もまとめて、「令和3年度」を「令和4年度」に置換します。YouTubeでも解説しています。
okikae1.pyを実行すると
Excel、Wordのサンプルファイルは下のボタンからダウンロードできます。
今回はExcelファイルだけでなく、Wordファイルを置換します。
python-docxのインストール
Wordファイルを編集するためにpython-docxパッケージを利⽤します。pipコマンドでインストールしてください。
pip install python-docx
python-docx は、Microsoft Word (.docx) ファイルを作成、更新、および操作するための Python ライブラリです。 ユーザーは、Microsoft Word やその他のワード プロセッシング ソフトウェアを必要とせずに、Word ドキュメントから情報をプログラムで作成、編集、および抽出できます。
このライブラリを使用して、新しいドキュメントを作成したり、既存のドキュメントにテキスト、段落、表、画像などを追加したり、ドキュメントからテキストやその他のデータを抽出したりできます。 また、フォント、サイズ、スタイルの変更など、テキストの書式設定を操作するためにも使用できます。
なお、Wordファイルを開いた状態でプログラムを実⾏すると、Wordの⼀時ファイル(~*○○.docxという隠しファイル)を読み込もうとしてエラーが起きることがあります。閉じた状態で実⾏してください。
Excelファイルを置換するokikae1.pyから⾒ていきましょう。書式などを崩さずに置換したいので、先ほどと同じopenpyxlを使⽤します。
okikae1.py
import openpyxl
import glob
import os
save_path=os.path.join(os.getcwd(),"変換完了")
for excel_filename in glob.glob("*.xlsx"):
workbook=openpyxl.load_workbook(excel_filename)
sheet=workbook.active
for row in sheet.iter_rows():
for cell in row:
if cell .value is not None:
cell.value=str(cell.value).replace("令和3年","令和4年")
excel_filename=excel_filename.replace("令和3年","令和4年")
workbook.save(os.path.join(save_path,excel_filename))
glob関数とload_workbook関数でファイルを読み込み、iter_rowsメソッドで列挙する
今回はフォルダ内の複数ファイルが対象なので、glob関数を使います。取得した複数のファイルをopenpyxlのload_workbook関数で読み込みます。そして2重ループでワークシート内の全セルの内容を置換していきます。
glob 関数は、ワイルドカード文字を使用して、指定されたファイルを検索できるようにする Python 組み込みモジュールです。 たとえば、ディレクトリ内のすべての .txt ファイルのリストを取得する場合は、次のコードを使用できます。
import glob
txt_files = glob.glob("*.txt")
print(txt_files)
データが⼊⼒されている全⾏を列挙するために、iter_rowsメソッドを使っています。これはpandasのiterrowsメソッドと似たようなものです。そして内側のfor⽂で⾏からセルを抜き出し、置換処理を⾏っていきます。
空のセルに対して置換処理を⾏うとエラーが発⽣するので、if⽂でセルのvalue属性をチェックしています。
iter_rows() は python-openpyxl ライブラリで利用可能なメソッドで、Python で Microsoft Excel ファイルを操作するために使用されます。 iter_rows() メソッドは、Excel ファイル内の特定のシートの行を反復処理するために使用されます。 iter_rows() メソッドを使用するための基本的な構文は次のとおりです。
from openpyxl import load_workbook
wb = load_workbook('example.xlsx')
sheet = wb.active
for row in sheet.iter_rows():
for cell in row:
print(cell.value)
メソッドは 4 つのパラメーターを取ります。
min_row: 反復に含める最初の行を指定するオプションのパラメーター。 デフォルト値は 1 で、最初の行から開始することを意味します。
max_row: 反復に含める最後の行を指定するオプションのパラメーター。 指定しない場合、反復にはシートの最後までのすべての行が含まれます。
min_col: 反復に含める最初の列を指定するオプションのパラメーター。 デフォルト値は 1 で、最初の列から開始することを意味します。
max_col: 反復に含める最後の列を指定するオプションのパラメーター。 指定しない場合、反復にはシートの最後までのすべての列が含まれます。 反復ごとに、変数行には、その行のセルを表す Cell オブジェクトのタプルが含まれます。
iter_rows( ) は空の行を含むすべての行を返すことに注意してください。
replaceメソッドで置き換え
空のセルではない場合は、⽂字列⽤のreplaceメソッドを使って「令和3年」を「令和4年」に置換し、それをセルのvalue属性に代⼊します。
セル内の置換が終わったら、ファイル名を置換して保存します。変換完了フォルダ内に保存するので、ファイルパスを連結するos.path.joinメソッドを使います。つまり、カレントディレクトリと「変換完了」を連結し、さらにExcelファイル名を連結しそれを保存名にしているのです。
replace() メソッドは、指定された文字列内の指定された部分を別の部分文字列に置き換える Python の文字列メソッドです。 replace() メソッドを使用するための基本的な構文は次のとおりです。
new_string = original_string.replace(old, new[, count])
new は、old を置き換える部分文字列です。 count (オプション) は、置換する古い部分文字列の最大出現回数です。 指定しない場合、すべてのオカレンスが置き換えられます。 たとえば、”Hello World” という文字列があり、”World” という単語を “Python” に置き換えたい場合は、次のコードを使用できます。
original_string = "Hello World"
new_string = original_string.replace("World", "Python")
print(new_string)
これにより、”Hello Python” が出力されます。 最初に見つかった部分文字列のみを置換する場合は、count パラメーターを指定できます。 これにより、「Hello Python, World」が出力されます。 replace() メソッドは新しい文字列を返し、元の文字列を変更しないことに注意してください。
replaceはPythonの⽂字列変換⽤のメソッドです。Excelファイル名は最初から⽂字列ですし、セル内の値はstr関数を使って⽂字列に変換しているから、同じように置換できるんですよ。
次はWordファイルの置換を⾏います。
okikae2.py
from docx import Document
import glob
import os
save_path=os.path.join(os.getcwd(),"変換完了")
for word_filename in glob.glob("*.docx"):
document=Document(word_filename)
for paragraph in document.paragraphs:
paragraph.text=paragraph.text.replace("令和3年","令和4年")
for table in document.tables:
for row in table.rows:
for cell in row.cells:
cell.text=cell.text.replace("令和3年4月8日(木)","令和4年4月7日(木)")
word_filename=word_filename.replace("令和3年","令和4年")
document.save(os.path.join(save_path,word_filename))
okikae2.pyを⾒てみましょう。Wordファイルは
python-docxパッケージ
で編集します。
python-docxでファイルを開くには、Document関数を使います。この関数は引数を指定しない場合、新規ドキュメントを作成します。
document = Document(word_filename)
Excelではすべてのセルを置換しましたが、Wordではすべての段落と表内のセルを置換します。すべての段落はdocument.paragraphs属性で取得できるので、それらをfor⽂で繰り返し処理して置換していきます。
すべての表は
document.tables属性
で取得できます。表内の⾏、⾏内のセルを取得し、replaceメソッドで置換していきます。その部分の処理を抜き出してみると、Excelでの操作に似ていますね。
PythonでExcelを操るテクニック
openpyxlの使い方 Excelの差し込みがワンクリックで
tabulaのconvert_into関数でPDFファイルをExcelに変換
これは便利!Pythonのconcat関数で追記するプログラムをつくる
【Python】項目がバラバラなExcelファイルを一つにまとめる