【Python】Windowsで open の引数にフォルダを指定すると PermissionError が発生する
この記事の目次
最近気づいた仕様ですが、Windowsでは、open() 関数にフォルダ(ディレクトリ)を指定すると、PermissionError が発生します
Linuxの場合
Linuxで同じことをやると、より分かりやすいエラーメッセージが表示されます。例えば、次のような手順でディレクトリを作成し、そのディレクトリを open() しようとした場合です。
$ mkdir hoge $ python >>> open("hoge") Traceback (most recent call last): File "<stdin>", line 1, in <module> IsADirectoryError: [Errno 21] Is a directory: 'hoge'
Linuxでは IsADirectoryError: [Errno 21] が表示され、「'hoge' はディレクトリなので、ファイルとしては open できない」とのエラーが出ます。非常に直感的で、すぐに問題が理解できます。
Windowsの場合
一方、Windowsで同様のことを行うと、異なるエラーメッセージが表示されます。
> mkdir hoge > python >>> open("hoge") Traceback (most recent call last): File "<stdin>", line 1, in <module> PermissionError: [Errno 13] Permission denied: 'hoge'
このエラーメッセージは一見、「権限が不足している」ように見えますが、実際にはディレクトリをファイルとして open() しようとしたために発生しているものです。Windowsでは、IsADirectoryError ではなく、PermissionError: [Errno 13] が発生します。
なぜ PermissionError が発生するのか?
Windowsの場合、ディレクトリに対してファイル操作を行おうとすると、アクセス権限の問題として扱われるため、エラーが PermissionError となります。しかし、実際の原因はディレクトリをファイルとして open() しようとしたことにあります。
結論
Linuxでは、ディレクトリを open() しようとすると IsADirectoryError が発生します。
Windowsでは、ディレクトリを open() しようとすると PermissionError が発生しますが、実際にはディレクトリをファイルとして扱おうとしたことが原因です。
Windowsで開発する際には、この違いを覚えておくと良いでしょう。