【Python】既存のExcelファイルが開かれているかチェックする

スポンサーリンク

Pythonで処理した結果を既存のExcelファイルに出力して保存したいことって結構ありますよね!!

手順はopenpyxlを利用して以下のようにしていることが多いと思います。

  • load_workbookで既存のファイルを開く
  • 出力内容を既存のファイルに書き込む
  • 保存する

この時に、既存のファイルを開いた状態で実行してしまうと以下のエラーが出てしまいます。

PermissionError: [Errno 13] Permission denied: 'xxxx.xlsx'

これは、ファイルが開いている状態のため保存することができないという意味のエラーです。

このエラーは、ファイルを閉じてからやり直せば問題ないのですが、出力前にチェックして、開かれていた場合はエラーメッセージを表示させるようにしたいと思い、チェックする関数を作ってみました。

もっといい方法でできそうな気もしますが、とりあえずこれで出力前にファイルが開かれていたらエラーにすることができます。

Excelファイルが開かれていないかチェックする関数

以下がExcelファイルが開かれていないかチェックする関数です。

import openpyxl as px

#Excelファイルが開かれていないかチェック
def xlsx_open_check(filepath):
    wb = px.load_workbook(filepath)
    try:
        wb.save(filepath)
    except PermissionError:
        print(filepath + 'が開かれています。閉じてから再度実行してください')
    else:
        return True

if (xlsx_open_check('test.xlsx')):
    #Excelが開かれていないのでそのまま処理を続行
    print('出力処理')

保存時に発生するエラーをキャッチする

Excelファイルが開かれているかをチェックするためだけに対象のExcelファイルを開き、
何もせずに保存しています。

ファイルが既に開かれている状態であれば、保存できないのでPermissionErrorが発生します。

PermissinonError時のみ例外処理を行う

ファイルが既に開かれている状態の時のエラーであるPermissionErrorが発生したときのみに以下のブロックが実行されます。これでファイルが既に開かれている場合は、「ファイル名が開かれています。閉じてから再度実行してください」というメッセージが表示されるようになります。

 except PermissionError:
        print(filepath + 'が開かれています。閉じてから再度実行してください')

また、ファイルが開かれていないときは、else:のブロックに正常終了したときの出力処理を書きます。

これでファイルが開かれていなければ、出力した内容を保存できるので処理を続行し、開かれていた場合は保存できないのでエラーメッセージを表示させるようにすることができました。

もっといい書き方があれば、教えていただければと思います。

コメント

タイトルとURLをコピーしました