shutil.copyfileでpermission deniedがでたときは引数を見直そう[Python][shutil]

11月 23, 2020

Windowsでファイルをあるフォルダへコピーするコードを書いた際,以下のエラーがでた.

import shutil
path1 = r"C:\Users\hoge\Documents\hoge\hoge.pdf"
path2 = r"C:\Users\hoge\Documents\hoge2"
shutil.copyfile(path1, path2)
>>
PermissionError: [Errno 13] Permission denied: 'C:\Users\hoge\Documents\hoge2'

このエラーを見たとき,hoge2というフォルダにアクセス権限が無いのかと勘違いし,管理者権限でコマンドプロンプトを開いたり,フォルダの読み取り設定を見直したりした.

しかし,エラーの原因はフォルダにアクセス権限が無いことではないのだ.

実は,shutil.copyfileは引数として入力ファイル名・出力ファイル名を与えなければならない関数だったのだ.

shutil — 高水準のファイル操作 — Python 3.8.0 ドキュメント

この為,エラーは引数として与えたものが出力フォルダ名だったことが原因だ.

そして,ファイルをあるフォルダへコピーする際にはshutil.copyを使うべきだったのだ.

import shutil
path1 = r"C:\Users\hoge\Documents\hoge\hoge.pdf"
path2 = r"C:\Users\hoge\Documents\hoge2"
shutil.copy(path1, path2)

なんという凡ミス.しかしながら,Permission deniedがでるのはちと混乱を招く気がする.

この他にもPythonicなコーディング手法を身に着けたいときには以下の書籍がおすすめです。

Python

Posted by vastee