前提・実現したいこと
見ていただきありがとうございます!
実現したいこととして、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)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。