質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

9623閲覧

Python:PermissionErrorの回避方法について_shutil.copy()で回避したい

daichiddd

総合スコア9

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/07 09:54

編集2021/12/07 13:17

前提・実現したいこと

見ていただきありがとうございます!

実現したいこととして、Excelファイル内で処理を行う際に、ファイルが開かれている状態でも処理を可能にさせることです。
理由としてpythonで処理を行いたいファイルが誰もがアクセスできる所に置いてあり、いつ誰がアクセスして開かれているような状態になるか分からないからです。

開かれているファイルのパスを指定して処理を行うとPermissionErrorが発生します。
そこで例外処理内で開かれているファイルの複製を行い、そのファイル内で処理を行うことでPermissionErrorを回避するようなものを考えています。
ここでは、ファイルの複製では複製したいファイルが開かれていてもPermissionErrorが発生しないことを前提にしています。

発生している問題・エラーコード

shutil.copy()関数はコピーしたいファイルが開かれていてもPermissionErrorを吐かないため、これを利用することをアイデアにコーディングしました。
しかし、例外処理のexcept内でshutil.sopy()関数の方でPermissionErrorが発生しました。
ファイルが開かれている状態なので、エラーが発生することは分かりますが、shutil.copy()関数でエラーを吐く理由が分かりません。

この質問でお聞きしたいのは、
・このコードでエラーが発生するのはなぜなのか
・shutil.copy()関数はPermissionErrorを吐かないのに例外処理内でエラーを吐くのはなぜなのか
・ファイルが開かれている場合でもPermissionErrorを回避し処理を正常に行うことは可能なのか

以上三点です。根本的に前提が間違っているかもしれません。ご指摘頂けると幸いです。

PermissionErrorです。 --------------------------------------------------------------------------- PermissionError Traceback (most recent call last) <ipython-input-41-98d20811835c> in ws_check(check_file_path) 15 try: ---> 16 wb = openpyxl.load_workbook(check_file_path) 17 except: ~\anaconda3\lib\site-packages\openpyxl\reader\excel.py in load_workbook(filename, read_only, keep_vba, data_only, keep_links) 314 """ --> 315 reader = ExcelReader(filename, read_only, keep_vba, 316 data_only, keep_links) ~\anaconda3\lib\site-packages\openpyxl\reader\excel.py in __init__(self, fn, read_only, keep_vba, data_only, keep_links) 123 data_only=False, keep_links=True): --> 124 self.archive = _validate_archive(fn) 125 self.valid_files = self.archive.namelist() ~\anaconda3\lib\site-packages\openpyxl\reader\excel.py in _validate_archive(filename) 95 ---> 96 archive = ZipFile(filename, 'r') 97 return archive ~\anaconda3\lib\zipfile.py in __init__(self, file, mode, compression, allowZip64, compresslevel, strict_timestamps) 1250 try: -> 1251 self.fp = io.open(file, filemode) 1252 except OSError: PermissionError: [Errno 13] Permission denied: 'C:\Users\Desktop\new_dir\~$関連性可視化_20211207-1719.xlsx' During handling of the above exception, another exception occurred: PermissionError Traceback (most recent call last) <ipython-input-41-98d20811835c> in <module> 38 39 ---> 40 recursive_file_check(folder_path) <ipython-input-41-98d20811835c> in recursive_file_check(path) 30 files = os.listdir(path) 31 for file in files: ---> 32 recursive_file_check(path + "\" + file) 33 else: 34 # Excelファイルだったら処理 <ipython-input-41-98d20811835c> in recursive_file_check(path) 35 if path[-5:] == ".xlsx": 36 list_documents.append(os.path.basename(path)) ---> 37 ws_check(path) 38 39 <ipython-input-41-98d20811835c> in ws_check(check_file_path) 18 print("PermissionErrorです。") 19 provisional_path = r"C:\Users\Desktop" ---> 20 shutil.copy(check_file_path, provisional_path) 21 else: 22 print("成功") ~\anaconda3\lib\shutil.py in copy(src, dst, follow_symlinks) 413 if os.path.isdir(dst): 414 dst = os.path.join(dst, os.path.basename(src)) --> 415 copyfile(src, dst, follow_symlinks=follow_symlinks) 416 copymode(src, dst, follow_symlinks=follow_symlinks) 417 return dst ~\anaconda3\lib\shutil.py in copyfile(src, dst, follow_symlinks) 259 os.symlink(os.readlink(src), dst) 260 else: --> 261 with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst: 262 # macOS 263 if _HAS_FCOPYFILE: PermissionError: [Errno 13] Permission denied: 'C:\Users\Desktop\new_dir\~$関連性可視化_20211207-1719.xlsx' ​

該当のソースコード

python

1import shutil 2import openpyxl 3import os 4 5folder_path = r"C:\Users\Desktop\new_dir" 6 7def process(file_path): 8 print(file_path) 9 10 11def ws_check(check_file_path): 12 try: 13 wb = openpyxl.load_workbook(check_file_path) 14 except PermissionError: 15 print("PermissionErrorです。") 16 # 移動先のパス 17 provisional_path = r"C:\Users\Desktop" 18 shutil.copy(check_file_path, provisional_path) 19 # 以下コピー先のファイルでelse内の処理を行う 20 PE_path = provisional_path + "\" + os.path.basename(check_file_path) 21 process(PE_path) 22 else: 23 print("成功") 24 process(check_file_path) 25 26 27 28 29def recursive_file_check(path): 30 if os.path.isdir(path): 31 # directoryだったら中のファイルに対して再帰的にこの関数を実行 32 files = os.listdir(path) 33 for file in files: 34 recursive_file_check(path + "\" + file) 35 else: 36 # Excelファイルだったら処理 37 if path[-5:] == ".xlsx": 38 list_documents.append(os.path.basename(path)) 39 ws_check(path) 40 41 42recursive_file_check(folder_path)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  • ファイルが開かれている状態なので、エラーが発生することは分かりますが、shutil.copy()関数でエラーを吐く理由が分かりません。

エラーメッセージは、
Permission denied: 'C:\Users\Desktop\new_dir~$関連性可視化_20211207-1719.xlsx'
です。コピー元ファイルが開かれていることは問題ではなく、コピー先ファイルを書込みオープンできないエラーです。ディレクトリの書込み許可を確認してください。

  • ファイルが開かれている場合でもPermissionErrorを回避し処理を正常に行うことは可能なのか

可能でしょう。

書込みオープン失敗の原因をちゃんと調べましょう。

投稿2021/12/07 10:15

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問