Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

PermissionError: [Errno 13] Permission denied:を解決したい。

PermissionError: [Errno 13] Permission denied:を解決したい。

教師なし学習を行わせる際に作成したコードを実行したところ実行させた中にある指定ファイルの権限がないと言われ進めません。
解決方法を教えていただきたいです。
個人的なファイルになっているためファイル名をA,B,Cで置き換えています。エラーの出ているファイルはCと置き換えてあファイルになっています。

使用環境
windows10
jupyter notebook
python 3.10.6

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

UnboundLocalError                         Traceback (most recent call last)
Cell In[4], line 122
    118     plot_scatter3d(pca_df)
    121 if __name__ == "__main__":
--> 122     main()

Cell In[4], line 100, in main()
     97 CSV_PATH = r'C:/Users/kuror/image1/microscope_pca.csv'
     99 try:
--> 100     pca_df.to_csv(CSV_PATH, index=False)
    101 except FileNotFoundError:
    102     npy_image_list = load_image(LOAD_PATH)

UnboundLocalError: cannot access local variable 'pca_df' where it is not associated with a value

該当するソースコード

import glob as gb
import shutil
import cv2
import os
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import seaborn as sns
from mpl_toolkits.mplot3d import Axes3D


# 画像の読み込み
def load_image(path):
    image_list = []
    npy_image_list = []
    image_path_list = gb.glob(f"{path}/*")  # 画像の保存先次第で変更

    for i, image in enumerate(image_path_list):
        image_path = image.replace(chr(92), '/')  # Windows特有の問題を修正
        if i % 100 == 0:
            print(i)
        
        img_npy = cv2.imread(image_path, cv2.IMREAD_COLOR)
        img_npy = cv2.cvtColor(img_npy, cv2.COLOR_BGR2RGB)
        img_npy = cv2.resize(img_npy, (64, 64))
        img_npy = img_npy.flatten()
        npy_image_list.append(img_npy / 255)

    return npy_image_list


def build_kmeans(df, cluster_num):
    kmeans = KMeans(n_clusters=cluster_num, random_state=2021)
    kmeans.fit(df)
    return kmeans


def build_pca(df):
    pca = PCA()
    pca.fit(df)
    return pca


def plot_contribution_rate(pca):
    fig = plt.figure()
    plt.gca().get_xaxis().set_major_locator(ticker.MaxNLocator(integer=True))
    plt.plot([0] + list(np.cumsum(pca.explained_variance_ratio_)), "-o")
    plt.xlabel("Number of principal components")
    plt.ylabel("Cumulative contribution rate")
    plt.grid()
    plt.show()


def plot_scatter2d(df):
    fig = plt.figure()
    sns.scatterplot(data=df, x='PC1', y='PC2', hue='label', palette='bright', legend='full')
    plt.show()


def plot_scatter3d(df):
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.set_xlabel("PC1")
    ax.set_ylabel("PC2")
    ax.set_zlabel("PC3")

    for label in df['label'].values:
        ax.plot(df.loc[df['label'] == label, 'PC1'],
                df.loc[df['label'] == label, 'PC2'],
                df.loc[df['label'] == label, 'PC3'],
                alpha=0.8, marker=".", linestyle='None')
    plt.show()


def make_cluster_dir(load_path, save_path, kmeans):
    shutil.rmtree(save_path, ignore_errors=True)
    os.makedirs(save_path, exist_ok=True)

    for i in range(kmeans.n_clusters):
        cluster_dir = os.path.join(save_path, f"cluster{i}")
        os.makedirs(cluster_dir, exist_ok=True)

    image_path_list = gb.glob(os.path.join(load_path, '*'))
    for label, path in zip(kmeans.labels_, image_path_list):
        shutil.copyfile(path, os.path.join(save_path, f'cluster{label}', os.path.basename(path)))

    print('クラスタごとにファイル作成完了')


def main():
    LOAD_PATH = 'C:/Users/kuror/image1/microscope'
    SAVE_PATH = 'C:/Users/kuror/image1/microscope_clustering'
    CSV_PATH = r'C:/Users/kuror/image1/microscope_pca.csv'
    
    try:
        pca_df.to_csv(CSV_PATH, index=False)
    except FileNotFoundError:
        npy_image_list = load_image(LOAD_PATH)
        df = pd.DataFrame(npy_image_list)
        print(df.shape)
        
        pca = build_pca(df)
        pca_df = pd.DataFrame(pca.transform(df), columns=[f"PC{x + 1}" for x in range(len(df.columns))])
        plot_contribution_rate(pca)
        pca_df.to_csv(CSV_PATH, index=False)
    
    train_df = pca_df.iloc[:, :1200]
    cluster_num = int(input('cluster_num > '))
    kmeans = build_kmeans(train_df, cluster_num)
    make_cluster_dir(LOAD_PATH, SAVE_PATH, kmeans)

    pca_df['label'] = kmeans.labels_
    plot_scatter2d(pca_df)
    plot_scatter3d(pca_df)


if __name__ == "__main__":
    main()

自分で試したこと

エラーの出ているファイルの読み取り専用のチェックを外すことは試みましたが解決しませんでした。

0 likes

5Answer

'C.csv' はフォルダ名ですか?

Windowsでは、フォルダを開こうとすると、[Errno 13] Permission denied になるようです。

1Like

Comments

  1. @kurosoccer0515

    Questioner

    フォルダ名ですね。
    C.csvを主成分分析した結果の保存先として指定したいのですがフォルダは指定できないという事でしょうか?
    また、フォルダを保存先として指定できない場合は保存先をどのようにしていしたらいいのか教えていただくことはできますでしょうか。

  2. C.csvを主成分分析した結果の保存先として指定したいのですがフォルダは指定できないという事でしょうか?

    フォルダ名だけの指定はできませんので、
    保存先のフォルダ名を含む パス名を指定することになります。
    相対パスだと、実行するカレントディレクトリに依存するので、フルパスがよいかも知れません。

    CSV_PATH = r'C:\path\to\you\filename.csv'
    pca_df.to_csv(CSV_PATH, index=False)
    

    なお、PermissionError: [Errno 13] Permission denied: 'C.csv'は、
    pca_df = pd.read_csv(CSV_PATH)で発生していますので、ここはファイルの入力です。

  3. @kurosoccer0515

    Questioner

    申し訳ありません。
    確認しなおしたところフォルダ名ではなくフルパスになっていました。
    この状態の場合はないを修正すればよいかも一度ご教授いただいてもよろしいでしょうか?

  4. 確認しなおしたところフォルダ名ではなくフルパスになっていました。

    エラーログは以下の内容ですから、フルパスではありません。

    Cell In[8], line 100, in main()
         97 CSV_PATH = 'C.csv'
         99 try:
    --> 100     pca_df = pd.read_csv(CSV_PATH)
        101 except FileNotFoundError:
    

    フルパスにしてもPermissionError: [Errno 13] Permission deniedが発生するということであれば、冒頭のコードを現状のコードに修正して、さらにエラー時のログも最新にしてください。

  5. @kurosoccer0515

    Questioner

    ありがとうございます。修正したところおそらくPermissionErrorは解決したと思われます。
    その先で異なるエラーが出現したのですがこちらも修正方法を教えていただくことはできますでしょうか?
    お時間いただいてしまい申し訳ありません。
    スクリーンショット 2025-01-17 134338.png

  6. 97行目の CSV_PATH = 'C:\path\to\you\XXXXXX.csv' には、2つの間違いがあります。
    一つ目は、\path\to\you は例ですから、質問者さんの環境の実在するパスを指定する必要があります。
    2つ目は、\はエスケープ文字のため、文字列で指定するなら、2つ重ねて、'C:\\path\\to\\you\\XXXXXX.csv' とするか、rを付けて r'C:\path\to\you\XXXXXX.csv' として raw 指定するか のどちらかとしてください。

  7. @kurosoccer0515

    Questioner

    CSV_PATH = 'C:/path/to/you/XXXXXX.csv' を自分のパスに置き換え、先頭にrを付け修正しましたが同様のエラーが出ているようです。ほかに修正の必要な箇所はありますでしょうか

  8. 実際のコードとエラーのログを見なければ判断できません。

  9. @kurosoccer0515

    Questioner

    コードとエラー内容を更新いたしました。ご教授お願いいたします。

  10. Cell In[4], line 100, in main()
         97 CSV_PATH = r'C:/Users/kuror/image1/microscope_pca.csv'
         99 try:
    --> 100     pca_df.to_csv(CSV_PATH, index=False)
        101 except FileNotFoundError:
        102     npy_image_list = load_image(LOAD_PATH)
    
    UnboundLocalError: cannot access local variable 'pca_df' where it is not associated with a value
    

    元々の100行目はpca_df = pd.read_csv(CSV_PATH)でしたが、pca_df.to_csv(CSV_PATH, index=False)に変更されています。これがUnboundLocalErrorの原因だと思います。


    ネットを検索したところ、非常によく似たコードを発見しました。↓これをコピーしたのでしょうか?

Comments

  1. @kurosoccer0515

    Questioner

    アクセス権限の付与の仕方をよければ教えていただけないでしょうか

  2. すみません。勘違いかもしれません。
    CSV_PATHはフルパスになってますか?
    具体的には、例えば、c:\\hogehoge\\c.csvとかになってますか?
    ファイル名だけであれば、実行時のフォルダと同じ場所にないと読めないと思います。
    LOAD_PATH = 'A'は、C.csvのパスを記載しているなら、
    read_csv(LOAD_PATH + CSV_PATH)という感じではないでしょうか

    LOAD_PATH = 'A'は画像か何か別の場所ぽいですね、間違いです。すみません。

        LOAD_PATH = 'A'
        SAVE_PATH = 'B'
        CSV_PATH = 'C.csv'
        
        try:
            pca_df = pd.read_csv(CSV_PATH)
    
  3. @kurosoccer0515

    Questioner

    フルパスになっていましたが置き換えました。

  4. フルパスということですが、次の点は間違いないか確認ください。(どちらでも結構です)

    • @nak435 様の記載のように、CSV_PATH = r'C:\path\to\you\filename.csv'となっているか
    • もしくは、CSV_PATH = 'C:\\path\\to\\you\\filename.csv'となっているか

Cファイルを他のアプリケーションで開いているということはありませんよね?

根本的な対策ではないですが、エディタで新規ファイルを作成してcsvファイルの内容をコピー&ペーストするとエラーは無くならないでしょうか?


【追記】
そのファイルのアクセス権限を確認して必要な権限を付与しましょう。
Windowsであればファイルのプロパティのセキュリティのところで自身にどのような権限があるか確認可能です。
もしも管理者権限が自身になく必要な権限を付与出来ない場合は、管理者に実施してもらってください。

0Like

ページ内検索でpca_dfという変数を走査すると、100行目のtryブロック内で初めて登場します

100     
pca_df.to_csv(CSV_PATH, index=False)
python
    try:
>        pca_df.to_csv(CSV_PATH, index=False)
    except FileNotFoundError:
        npy_image_list = load_image(LOAD_PATH)
        df = pd.DataFrame(npy_image_list)
        print(df.shape)
        
        pca = build_pca(df)
>        pca_df = pd.DataFrame(pca.transform(df), columns=[f"PC{x + 1}" for x in range(len(df.columns))])
        plot_contribution_rate(pca)
        pca_df.to_csv(CSV_PATH, index=False)

変数が例外補足時に定義されているため、これ以前に宣言も初期化も行われていません
よって不定値を扱っている解釈になり、 関連付けのない未定義の参照からメンバメソッドを呼び出している状態です

UnboundLocalError: 
cannot access local variable 'pca_df' 
where it is not associated with a value

> 値に関連付けられていないローカル変数 
   'pca_df' にアクセスできません
0Like

Comments

  1. @kurosoccer0515

    Questioner

    コメントありがとうございます。
    ご指摘いただいたように確かに定義付けされていませんでした。
    もしよろしければ、どこでどのように'pca_df'を定義または初期化すればいいかご教授いただくことはできますでしょうか?

質問タイトルPermissionError: [Errno 13] Permission denied:を解決したい。発生している問題・エラーの内容(UnboundLocalError)が一致しません。もしもタイトルの課題が解決されたのであれば本質問はクローズするべきではないでしょうか?もしも新たな課題が発生したのであれば新たに質問を立てるべきではないでしょうか?

0Like

Your answer might help someone💌