Pythonで処理した結果を既存のExcelファイルに出力して保存したいことって結構ありますよね!!
手順はopenpyxlを利用して以下のようにしていることが多いと思います。
- load_workbookで既存のファイルを開く
- 出力内容を既存のファイルに書き込む
- 保存する
この時に、既存のファイルを開いた状態で実行してしまうと以下のエラーが出てしまいます。
PermissionError: [Errno 13] Permission denied: 'xxxx.xlsx'
これは、ファイルが開いている状態のため保存することができないという意味のエラーです。
このエラーは,PythonでExcelを扱ったことがある人は、ほぼ見たことがあると思います。
このエラーは、ファイルを閉じてからやり直せば問題ないのですが、出力前にチェックして、開かれていた場合はエラーメッセージを表示させるようにしたいと思い、チェックする関数を作ってみました。
もっといい方法でできそうな気もしますが、とりあえずこれで出力前にファイルが開かれていたらエラーにすることができます。
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('出力処理')
保存時に発生するエラーをtryで例外処理を扱う
Excelファイルが開かれているかをチェックするためだけに対象のExcelファイルをとりあえず開き、
何もせずに保存しています。
ファイルが既に開かれている状態であれば、保存できないので必ずPermissionErrorが発生します。
PermissinonError時のみ例外処理を行う
ファイルが既に開かれている状態の時のエラーであるPermissionErrorが発生したときのみに以下のブロックが実行されます。これでファイルが既に開かれている場合は、「ファイル名が開かれています。閉じてから再度実行してください」というメッセージが表示されるようになります。
except PermissionError: print(filepath + 'が開かれています。閉じてから再度実行してください')
また、ファイルが開かれていないときは、else:のブロックに正常終了したときの出力処理を書きます。
Pythonはelse:がかけるので便利ですね!!!
これでファイルが開いていない状態では処理を続行し、開かれていた場合は保存できないのでエラーメッセージを表示させるようにすることができました。
もっといい書き方があれば、教えていただければと思います。
コメント