複数のファイルの文字をまとめて置き換えする

haruki
新年度になると、書類作成が増えますよね

恒例行事の場合、書類はたいてい昨年度のものを、〇〇年度を新しくして使いまわします。

今回はそこを⾃動化してみましょう。⽂書の中の⽂字も、ファイル名もまとめて、「令和3年度」を「令和4年度」に置換します。

okikae1.pyを実行すると

Excel、Wordのサンプルファイルは下のボタンからダウンロードできます。

 

 今回はExcelファイルだけでなく、Wordファイルを置換します。 

Wordファイルを編集するためにpython-docxパッケージを利⽤します。pipコマンドでインストールしてください。

pip install python-docx

なお、Wordファイルを開いた状態でokikae2.pyを実⾏すると、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関数を使います。取得した複数のファイルをopenpyxlのload_workbook関数で読み込みます。そして2重ループでワークシート内の全セルの内容を置換していきます。

データが⼊⼒されている全⾏を列挙するために、iter_rowsメソッドを使っています。これはpandasのiterrowsメソッドと似たようなものです。そして内側のfor⽂で⾏からセルを抜き出し、置換処理を⾏っていきます。

空のセルに対して置換処理を⾏うとエラーが発⽣するので、if⽂でセルのvalue属性をチェックしています。

空のセルではない場合は、⽂字列⽤のreplaceメソッドを使って「令和3年」を「令和4年」に置換し、それをセルのvalue属性に代⼊します。

セル内の置換が終わったら、ファイル名を置換して保存します。変換完了フォルダ内に保存するので、ファイルパスを連結するos.path.joinメソッドを使います。つまり、カレントディレクトリと「変換完了」を連結し、さらにExcelファイル名を連結しそれを保存名にしているのです。

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ファイルを一つにまとめる

【Python】globモジュールの便利な使い方

iterrowsメソッドで複数のファイルを1つにまとめる

【Python】to_excelメソッドでCSVファイルをExcel形式に変換

Pythonの開発環境をAnacondaで整える~プログラム実行まで~

最新情報をチェックしよう!
>プログラミング 独学

プログラミング 独学

本当にプログラミングを学びたい人のためになるブログにしたいと思っていますので、些細なことでも気が付いたのであればご報告いただけると幸いです。

CTR IMG