PythonのPermissionErrorとは?意味・原因・直し方を初心者向けに解説

ながみえ

Pythonでファイルを読み込んだり保存したりするときに、次のようなエラーが表示されることがあります。

PermissionError: [Errno 13] Permission denied: 'report.xlsx'

PermissionErrorは、Pythonがファイルやフォルダを操作しようとしたものの、その操作を許可されなかったときに発生するエラーです。

特に、Excelファイルを開いたまま上書きしようとした場合や、書き込み権限のないフォルダへファイルを保存しようとした場合によく発生します。

ExcelやCSVを扱っているときにPermissionErrorが出た場合は、まず対象のファイルを別のアプリで開いていないか確認しましょう。ファイルを閉じても直らない場合は、保存先の権限、読み取り専用の設定、ファイルパスなどを順番に確認します。

この記事では、PythonのPermissionErrorの意味、主な原因、エラーが発生するコード例、具体的な直し方を初心者向けに解説します。

Pythonでよく発生するエラーをまとめて確認したい方は、「Pythonエラー一覧」も参考にしてください。

あわせて読みたい
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
あわせて読みたい
Python入門講座|初心者向け無料カリキュラム
Python入門講座|初心者向け無料カリキュラム

PermissionErrorとは

PermissionErrorは、ファイルやフォルダに対して必要な操作を行う権限がないときに発生するエラーです。

初心者のうちは、「Pythonに管理者権限がないときだけ発生するエラー」と考えてしまうかもしれません。しかし、実際にはファイルをExcelで開いたままにしている場合や、読み取り専用のファイルを上書きしようとした場合にも発生します。

たとえば、Pythonでreport.xlsxを上書き保存しようとしても、Excelがそのファイルを使用していると、OSによって保存処理を拒否されることがあります。その結果、PermissionErrorが表示されます。

PermissionErrorが出たときは、コードだけを見るのではなく、対象ファイルの状態や保存先の設定も確認することが大切です。

まずは「どのファイルやフォルダへの操作が拒否されたのか」を、エラーメッセージの最後の部分で確認しましょう。

PermissionError: [Errno 13] Permission deniedの意味

PermissionErrorが発生すると、エラーメッセージには次のような内容が表示されます。

PermissionError: [Errno 13] Permission denied: 'report.xlsx'

このメッセージには、エラーの種類や原因、操作できなかったファイル名が含まれています。

それぞれの部分を分けて見ると、何を確認すればよいか分かりやすくなります。

表示意味
PermissionErrorファイルやフォルダの操作を許可されなかったことを示すエラー名
[Errno 13]OSから返されたエラー番号
Permission denied操作する権限が拒否されたという意味
'report.xlsx'操作できなかったファイルやフォルダの名前

Errno 13は、ファイルやフォルダへのアクセスを拒否されたときによく表示されるエラー番号です。すべての番号を暗記する必要はありません。

まずは、エラーメッセージの最後に表示されているファイル名を確認しましょう。この例では、report.xlsxに対する操作が拒否されています。

次に、そのファイルをExcelなどで開いていないか、上書きできる状態になっているか、保存先に書き込み権限があるかを確認します。

また、Permission deniedと表示されていても、必ずしもパソコンの管理者権限が必要とは限りません。ファイルが別のアプリで使用されていたり、読み取り専用になっていたりする場合にも発生します。

エラーメッセージ全体の読み方を基礎から学びたい方は、Lesson2-8「エラーメッセージの意味を理解しよう」も参考にしてください。

PermissionErrorが起きる主な原因

PermissionErrorが発生する原因は1つではありません。

特に多いのは、Excelなどの別のアプリでファイルを開いている場合や、書き込みが許可されていない場所へ保存しようとしている場合です。

主な原因と確認するポイントを整理すると、次のようになります。

原因起きやすい場面確認すること
別のアプリでファイルを開いているExcelやCSVを上書き保存するとき対象ファイルをExcelなどで開いていないか
保存先に書き込み権限がないシステムフォルダや共有フォルダへ保存するときそのフォルダに自分でファイルを作成できるか
ファイルが読み取り専用になっているダウンロードしたファイルや共有ファイルを上書きするときファイルのプロパティや保存設定
保護されたフォルダを指定しているProgram Filesなどへ保存するときデスクトップや作業フォルダへ保存できるか
ファイルではなくフォルダを指定しているopen()read_csv()でパスを指定するときパスの最後にファイル名と拡張子があるか
Python側でファイルを閉じていないファイルの書き込み後に削除や移動をするときclose()またはwith文を使っているか
別の処理がファイルを使用しているファイルの削除や名前変更をするとき他のプログラムや処理が動いていないか

初心者が最初に確認したいのは、対象ファイルを別のアプリで開いていないかという点です。

たとえば、PythonでExcelファイルを更新しようとしても、同じファイルをExcelで開いていると、上書き保存を拒否されることがあります。この場合は、Excelを閉じてからPythonのプログラムをもう一度実行します。

ファイルを閉じても直らない場合は、別のファイル名で保存できるか試してみましょう。別名では保存できる場合、元のファイルが使用中になっているか、読み取り専用になっている可能性があります。

別名でも保存できない場合は、保存先のフォルダに問題があるかもしれません。まずは、デスクトップやPythonファイルと同じフォルダなど、自分で書き込める場所へ保存して確認すると、原因を切り分けやすくなります。

また、open()などに指定したパスがファイルではなくフォルダになっている場合にも、環境によってPermissionErrorが発生することがあります。権限だけでなく、ファイル名や拡張子まで正しく指定しているかも確認しましょう。

PermissionErrorのエラー例と修正例

PermissionErrorの原因を見つけるには、どのような操作をしたときにエラーが出たのかを確認することが大切です。

ここでは、初心者が遭遇しやすいパターンを、エラーになるコードと修正例に分けて紹介します。

Excelファイルを開いたまま保存している

openpyxlを使ってExcelファイルを更新する場合、対象のファイルをExcelで開いたままにしていると、保存時にPermissionErrorが発生することがあります。

次のコードでは、report.xlsxを読み込み、セルの内容を変更して同じファイルへ上書き保存しています。

from openpyxl import load_workbook

workbook = load_workbook("report.xlsx")
sheet = workbook.active

sheet["A1"] = "更新しました"

workbook.save("report.xlsx")

report.xlsxをExcelで開いた状態でこのコードを実行すると、Windows環境では次のようなエラーが表示されることがあります。

PermissionError: [Errno 13] Permission denied: 'report.xlsx'

この場合は、Pythonのコードに間違いがあるとは限りません。Excelがファイルを使用しているため、Pythonによる上書き保存が拒否されています。

修正するには、Excelでreport.xlsxを閉じてから、もう一度プログラムを実行します。

ファイルを閉じても直らない場合は、別の名前で保存できるか試してみましょう。

from openpyxl import load_workbook

workbook = load_workbook("report.xlsx")
sheet = workbook.active

sheet["A1"] = "更新しました"

workbook.save("report_updated.xlsx")

report_updated.xlsxという別名で保存できる場合は、元のreport.xlsxが別のアプリで使用されているか、上書きできない設定になっている可能性があります。

Excelの画面を閉じてもエラーが続く場合は、Excelの処理がパソコン上に残っていることもあります。その場合は、Excelを完全に終了するか、パソコンを再起動してから試します。

保存先に書き込み権限がない

Pythonでファイルを作成するときは、保存先のフォルダに書き込み権限が必要です。

たとえば、Windowsのシステムで保護されているフォルダへ、一般ユーザーとしてファイルを保存しようとすると、PermissionErrorが発生することがあります。

with open(
    r"C:\Program Files\result.txt",
    "w",
    encoding="utf-8"
) as file:
    file.write("処理結果")

Program Filesは、アプリケーションのインストールなどに使われる保護されたフォルダです。利用している環境や設定によっては、自由にファイルを作成できません。

修正するには、自分が書き込めるフォルダへ保存します。

次の例では、Pythonのプログラムを実行している作業フォルダにresult.txtを作成します。

with open("result.txt", "w", encoding="utf-8") as file:
    file.write("処理結果")

デスクトップなど、保存可能な場所を明示的に指定する方法もあります。

from pathlib import Path

save_path = Path.home() / "Desktop" / "result.txt"

with open(save_path, "w", encoding="utf-8") as file:
    file.write("処理結果")

ただし、デスクトップの実際の場所はパソコンの設定によって異なる場合があります。

PermissionErrorが出たときは、すぐにPythonを管理者として実行するのではなく、まず保存先を変更してみましょう。別の場所に保存できれば、元の保存先の権限が原因だと判断しやすくなります。

ファイルが読み取り専用になっている

読み取り専用に設定されたファイルは、内容を確認できても上書きできないことがあります。

次のコードでは、既存のresult.txtを上書きしようとしています。

with open("result.txt", "w", encoding="utf-8") as file:
    file.write("新しい内容")

result.txtが読み取り専用になっている場合、環境によっては書き込みが拒否され、PermissionErrorが発生します。

この場合は、ファイルの設定を確認する必要があります。

Windowsでは、エクスプローラーで対象ファイルを右クリックし、「プロパティ」から読み取り専用の設定を確認できます。共有フォルダやクラウド上のファイルでは、自分に編集権限があるかも確認しましょう。

元のファイルを変更する必要がなければ、別名で保存する方法もあります。

with open("result_copy.txt", "w", encoding="utf-8") as file:
    file.write("新しい内容")

別名で保存できる場合は、Python全体の書き込み処理ではなく、元のファイルの設定に問題がある可能性があります。

メールに添付されていたファイルや、共有フォルダから取得したファイルでは、読み取り専用になっていることがあります。

その場合は、自分の作業フォルダへコピーしてから編集すると解決することがあります。

ファイルではなくフォルダを指定している

open()には、基本的に操作するファイルのパスを指定します。

次のコードでは、dataというフォルダをファイルとして開こうとしています。

with open("data", "r", encoding="utf-8") as file:
    text = file.read()

dataがフォルダの場合、ファイルとして読み込むことはできません。利用しているOSや環境によって、PermissionErrorやIsADirectoryErrorが表示されることがあります。

修正するには、フォルダの中にあるファイル名まで指定します。

with open("data/sample.txt", "r", encoding="utf-8") as file:
    text = file.read()

print(text)

パスがファイルとフォルダのどちらを示しているか分からない場合は、pathlibを使って確認できます。

from pathlib import Path

path = Path("data")

print(path.is_file())
print(path.is_dir())

is_file()Trueの場合はファイル、is_dir()Trueの場合はフォルダです。

たとえば、dataがフォルダなら、実行結果は次のようになります。

False
True

PermissionErrorと表示されていても、必ずしもアクセス権限だけが原因とは限りません。指定したパスの最後に、ファイル名と拡張子が含まれているかも確認しましょう。

Python側でファイルを閉じていない

Pythonで開いたファイルを閉じないまま、同じファイルを削除したり移動したりすると、環境によってはPermissionErrorが発生することがあります。

次のコードでは、ファイルを開いた後にclose()を実行していません。

import os

file = open("result.txt", "w", encoding="utf-8")
file.write("処理結果")

os.remove("result.txt")

ファイルが開いたままの状態で削除しようとしているため、Windowsなどでは削除処理を拒否されることがあります。

修正するには、ファイルへの書き込みが終わった後にclose()を実行します。

import os

file = open("result.txt", "w", encoding="utf-8")
file.write("処理結果")
file.close()

os.remove("result.txt")

ただし、close()を書き忘れる可能性があるため、ファイル操作ではwith文を使う方法がおすすめです。

import os

with open("result.txt", "w", encoding="utf-8") as file:
    file.write("処理結果")

os.remove("result.txt")

with文を使うと、インデントされた処理が終わった時点でファイルが自動的に閉じられます。

ファイルを閉じるタイミングを自分で管理する必要がないため、閉じ忘れによるトラブルを防ぎやすくなります。初心者のうちは、ファイルを読み書きするときはwith文を使うと覚えておくとよいでしょう。

PermissionErrorをtry-exceptで処理する方法

PermissionErrorが発生する可能性がある処理は、try-exceptを使って例外処理を追加できます。

例外処理を入れておくと、ファイルを操作できなかったときにプログラムが突然終了するのを防ぎ、利用者に確認してほしい内容を表示できます。

次のコードでは、result.txtへの書き込み中にPermissionErrorが発生した場合に、分かりやすいメッセージを表示します。

try:
    with open("result.txt", "w", encoding="utf-8") as file:
        file.write("処理結果")
except PermissionError:
    print("ファイルを閉じるか、保存先の権限を確認してください。")

ファイルが別のアプリで開かれていたり、保存先に書き込み権限がなかったりすると、except PermissionError:の中に書いた処理が実行されます。

エラーの詳しい内容も確認したい場合は、発生した例外を変数に受け取ります。

try:
    with open("result.txt", "w", encoding="utf-8") as file:
        file.write("処理結果")
except PermissionError as error:
    print("ファイルを保存できませんでした。")
    print(error)

この場合は、利用者向けの案内に加えて、Pythonが出したエラーメッセージも表示できます。どのファイルへの操作が拒否されたのかを確認したいときに役立ちます。

ただし、try-exceptを書くだけでPermissionErrorの原因が解決するわけではありません。ファイルがExcelで開かれている場合はファイルを閉じ、保存先に問題がある場合は書き込み可能な場所へ変更する必要があります。

また、すべてのエラーをまとめて捕捉するために、すぐにexcept:だけを書くのは避けましょう。PermissionErrorだけを指定すると、何の問題が起きたのか分かりやすくなります。

例外処理の基本を詳しく学びたい方は、Lesson2-9「例外処理を理解しよう」も参考にしてください。

PermissionErrorに関するよくある質問

PermissionErrorは、ファイルの状態や保存先の設定によって原因が変わります。

ここでは、Python初心者が迷いやすいポイントを質問形式で解説します。

PermissionError: [Errno 13] Permission deniedとはどういう意味ですか?

Pythonがファイルやフォルダを操作しようとしたものの、OSによってその操作を拒否されたという意味です。

たとえば、ファイルへ書き込もうとしたときに、対象ファイルがExcelで開かれていたり、保存先に書き込み権限がなかったりすると発生します。

次のように表示された場合は、report.xlsxへの操作が拒否されています。

PermissionError: [Errno 13] Permission denied: 'report.xlsx'

まずは、エラーメッセージの最後に表示されているファイル名を確認し、そのファイルを別のアプリで開いていないか見直しましょう。

Excelファイルを閉じたのにPermissionErrorが直らないのはなぜですか?

Excelの画面を閉じても、ファイルが別の処理で使用されていたり、読み取り専用になっていたりすると、PermissionErrorが続くことがあります。

また、Excelの処理がパソコン上に残っている可能性もあります。その場合は、Excelを完全に終了してから、もう一度Pythonを実行します。

それでも直らない場合は、別名で保存できるか試してみましょう。

workbook.save("report_updated.xlsx")

別名で保存できる場合は、元のファイルが使用中になっているか、上書きできない設定になっている可能性があります。

別名でも保存できない場合は、保存先のフォルダに書き込み権限があるか、ファイルパスが正しいかを確認してください。

CSVファイルをExcelで開いていてもPermissionErrorになりますか?

CSVファイルでも、Excelなどのアプリで開いたまま上書きしようとすると、環境によってPermissionErrorが発生することがあります。

たとえば、pandasで次のようにCSVファイルを保存する場合です。

import pandas as pd

data = {
    "name": ["田中", "佐藤"],
    "score": [80, 90]
}

df = pd.DataFrame(data)
df.to_csv("result.csv", index=False, encoding="utf-8-sig")

result.csvをExcelで開いたまま実行すると、保存処理を拒否されることがあります。

この場合は、ExcelでCSVファイルを閉じてから、もう一度プログラムを実行しましょう。別名のCSVファイルへ保存できるか試す方法もあります。

Pythonを管理者として実行すればPermissionErrorは直りますか?

保存先の権限不足が原因であれば、管理者として実行することで直る可能性はあります。

ただし、最初から管理者権限で実行する必要はありません。Excelでファイルを開いたままにしている場合や、ファイルが読み取り専用の場合は、管理者として実行しても根本的な解決にならないことがあります。

まずは、対象ファイルを閉じる、別名で保存する、保存先を変更するといった方法を試しましょう。

デスクトップやPythonファイルと同じフォルダに保存できる場合は、元の保存先の権限に問題があると判断できます。

except PermissionErrorを書けばエラーは解決しますか?

except PermissionErrorを書いても、PermissionErrorの原因そのものがなくなるわけではありません。

例外処理を使うと、エラーが発生したときにプログラムが突然終了するのを防ぎ、利用者に確認方法を案内できます。

try:
    with open("result.txt", "w", encoding="utf-8") as file:
        file.write("処理結果")
except PermissionError:
    print("ファイルを閉じるか、保存先を確認してください。")

このコードでは、PermissionErrorが発生したときにメッセージを表示できます。しかし、ファイルが別のアプリで開かれている場合は、実際にそのファイルを閉じる必要があります。

例外処理はエラーへの対応を分かりやすくする仕組みであり、ファイルの権限や使用状態を自動的に修正するものではありません。

まとめ|PermissionErrorはファイルの状態と権限を確認しよう

PermissionErrorは、Pythonがファイルやフォルダを操作しようとしたときに、OSから処理を拒否されると発生します。

特に多い原因は、ExcelやCSVファイルを別のアプリで開いたままにしていること、保存先に書き込み権限がないこと、ファイルが読み取り専用になっていることです。

エラーが出たときは、まずエラーメッセージの最後に表示されたファイル名を確認しましょう。その後、対象ファイルを閉じる、別名で保存する、保存先を変更する、パスを見直すという順番で確認すると、原因を見つけやすくなります。

Pythonでよく発生するエラーをまとめて確認したい方は、「Pythonエラー一覧」も参考にしてください。

あわせて読みたい
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
あわせて読みたい
Python入門講座|初心者向け無料カリキュラム
Python入門講座|初心者向け無料カリキュラム
記事URLをコピーしました