質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

5576閲覧

IsADirectoryErrorの解消

emsky

総合スコア2

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/11/03 01:20

編集2020/11/04 20:51

前提・実現したいこと

画像ファイルをクラスターにして、それぞれをフォルダに分けて保存したい。

発生している問題・エラーメッセージ

IsADirectoryError Traceback (most recent call last) <ipython-input-5-4daaa80c0646> in <module> 1 for label, path in zip(labels, os.listdir('./data2')): 2 os.makedirs(f"./data2_group/{label}", exist_ok=True) ----> 3 shutil.copyfile(f"./data2/{path.replace(' .jpg', ' ')}", f"./data2_group2/{label}/{path.replace(' .jpg', ' ')}") 4 print(label, path) /anaconda3/lib/python3.7/shutil.py in copyfile(src, dst, follow_symlinks) 118 os.symlink(os.readlink(src), dst) 119 else: --> 120 with open(src, 'rb') as fsrc: 121 with open(dst, 'wb') as fdst: 122 copyfileobj(fsrc, fdst) IsADirectoryError: [Errno 21] Is a directory: './data2/.ipynb_checkpoints' Errorの追記 --SOM-- FileNotFoundError Traceback (most recent call last) <ipython-input-8-68c047b322c4> in <module> 2 os.makedirs(f"./data2_group5/{label}", exist_ok=True) 3 if os.path.isfile(path): ----> 4 shutil.copyfile(f"./data2/{path.replace(' .jpg', ' ')}", f"./data2_group5/{label}/{path.replace(' .jpg', ' ')}") 5 print(label, path) /anaconda3/lib/python3.7/shutil.py in copyfile(src, dst, follow_symlinks) 119 else: 120 with open(src, 'rb') as fsrc: --> 121 with open(dst, 'wb') as fdst: 122 copyfileobj(fsrc, fdst) 123 return dst FileNotFoundError: [Errno 2] No such file or directory: './data2_group5/1/1_001.jpg' --EOM--

for label, path in zip(labels, os.listdir('./data2')):
os.makedirs(f"./data2_group/{label}", exist_ok=True)
shutil.copyfile(f"./data2/{path.replace(' .jpg', ' ')}", f"./data2_group2/{label}/{path.replace(' .jpg', ' ')}")
print(label, path)

--SOM--
for label , path in zip(labels, os.listdir('./data2' )) :
os.makedirs(f"./data2_group5/{label}", exist_ok=True)
if os.path.isfile(path):
shutil.copyfile(f"./data2/{path.replace(' .jpg', ' ')}", f"./data2_group5/{label}/{path.replace(' .jpg', ' ')}")
print(label, path)
--EOM--

Python 3.7.6 Anaconda Navigator Jupyter Notebook

試したこと

これを実施する前は他のデータではエラーが表示されませんでした。

補足情報(FW/ツールのバージョンなど)

Mac OS 10.14.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

shutil.copyfile()のコピー先はファイルパスにするボールドテキスト必要があります。フォルダに対して処理をしないようにする必要があります。


【追記】私の環境では下記コードでコピー出来ました。

python

1for label, path in zip(labels,os.listdir('./data2')): 2 os.makedirs(f"./data2_group/{label}", exist_ok=True) 3 if os.path.isfile('./data2/' + path): 4 shutil.copyfile(f"./data2/{path.replace(' .jpg', ' ')}", f"./data2_group2/{label}/{path.replace(' .jpg', ' ')}") 5 print(label, path)

投稿2020/11/03 01:57

編集2020/11/05 04:22
meg_

総合スコア10579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

emsky

2020/11/03 02:12

ご回答どうもありがとうございます。 以下を書き換える必要があるということですね。 shutil.copyfile(f"./data2/{path.replace(' .jpg', ' ')}", f"./data2_group2/{label}/{path.replace(' .jpg', ' ')}") どのように書き換えれば良いのかわかりません。ご教授いただけないでしょうか。よろしくお願いいたします。
meg_

2020/11/03 02:32

コピー処理を変更するのではなく、コピー先のパスがファイルのときだけコピー処理をすれば良いかと思います。 ※コピー先のパスがファイルかどうか判断する方法は検索すればすぐ見つかります。
emsky

2020/11/03 02:44

ありがとうございます。 検索して調べてみます。
emsky

2020/11/03 07:42

p = './data2_group2' f = os.path.isfile(p) d= os.path.isdir(p) False True コピー先のパスは、ディレクトリとわかりました。 shutil.copyfile ( )ディレクトリなのでコピー処理が不要となると思いますが( )の記述をどうすれば良いのか、わかりません。 他の記述がまずいのか・・・ 依然としてエラーは出ますが、data2内のファイルはdata2_group2内にコピーされています。
emsky

2020/11/03 09:23

shutil.copy( )にすれば良いのかと思いますが、それでもエラーは出ます。
meg_

2020/11/03 09:49

if os.path.isfile(path): shutil.copyfile(f"./data2/{path.replace(' .jpg', ' ')}", f"./data2_group2/{label}/{path.replace(' .jpg', ' ')}") とかでしょうか?
emsky

2020/11/03 14:35

ご教授ありがとうございます。 ご指摘いただいたようにすると以下のようなエラーになってしまいます。 --SOM-- for label , path in zip(labels, os.listdir('./data2' )) : os.makedirs(f"./data2_group2/{label}", exist_ok=True) if os.path.isfile(path): shutil.copyfile(f"./data2/{path.replace(' .jpg', ' ')}", f"./data2_group2/{label}/{path.replace(' .jpg', ' ')}") print(label, path) --EOM-- --Error-- --------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) <ipython-input-8-7cfa227db4af> in <module> 2 os.makedirs(f"./data2_group2/{label}", exist_ok=True) 3 if os.path.isfile(path): ----> 4 shutil.copyfile(f"./data2/{path.replace(' .jpg', ' ')}", f"./data2_group2/{label}/{path.replace(' .jpg', ' ')}") 5 print(label, path) /anaconda3/lib/python3.7/shutil.py in copyfile(src, dst, follow_symlinks) 119 else: 120 with open(src, 'rb') as fsrc: --> 121 with open(dst, 'wb') as fdst: 122 copyfileobj(fsrc, fdst) 123 return dst FileNotFoundError: [Errno 2] No such file or directory: './data2_group2/1/1_001.jpg'
emsky

2020/11/03 14:36

ご面倒にコメントありがとうございます。
meg_

2020/11/03 22:41

'./data2_group2/1’フォルダは存在していますか? ※ファイルは1つもコピーされなかったのでしょうか?
emsky

2020/11/04 00:05

data2_group2に、フォルダが二つとそれぞれにファイルが一つコピーされました。 data2には、ファイルが60、クラスターが4つあり、ラベルが0~3あります。
meg_

2020/11/04 00:11 編集

エラーメッセージから推測すると、コピー先のフォルダに問題がありそうですがどうでしょうか? エラーが出たものと出ていないものを比較すると何か分かるかもしれません。
emsky

2020/11/04 05:07

何度もコメントありがとうございます。 コピー先のフォルダは、できていますが4つのクラスターのうちの1と3のみで それぞれ中身は一つのファイルのみです。ファイルを比較しても違いはわかりません。ファイルの名前のつけかたに問題があったりするのでしょうか。
emsky

2020/11/04 05:11

今一度実行したところ、フォルダが4つできましたが、中身のファイルが作成されませんでした。 エラーは以下です。 FileNotFoundError: [Errno 2] No such file or directory: './data2_group3/2/1_001.jpg'
meg_

2020/11/04 07:54

最新のコードを質問に追記してください。コメント欄ですとインデントが分からないので確かなことが言えません。 ※エラーによると何故か2のフォルダが作成されていないようですね。。
emsky

2020/11/04 20:54

コードを再実行したところ、コピー先ホルダが新しく作成されましたが、その中に2つのホルダのみ作成され、中にファイルは作成されませんでした。 *インテンドがうまく表示できていないかもしれません。
emsky

2020/11/04 20:58

他の方にご指摘されている通り「丸投げ」の質問で大変申し訳ございません。 自分でも試行錯誤はしております。
meg_

2020/11/04 22:27

4つフォルダが作成されるはずが2つしか作成されていないということならば、下記コードのみで実行するとどうなりますか?※ファイルコピー処理以外に問題があるのかもしれませんので、その確認です。 for label, path in zip(labels, os.listdir('./data2')):   os.makedirs(f"./data2_group/{label}", exist_ok=True) また、labelsは[1,2,3,4]のようなリストでしょうか?
emsky

2020/11/05 03:03

ご教授通り実行したところ、コピー先フォルダの作成とその中にリストに対応するフォルダ4つが作成できました。しかし中身(ファイル、画像データ)が空っぽでした。 labelsは[0, 1, 2, 3]のリストになっています。labelsは上手くいっています。 コメントどうもありがとうございます。 大変恐縮しています。
emsky

2020/11/05 05:21

meg_様 ご教授いただいたコードで実行できました。2度試して実行できたので間違いありません。 貴重なお時間をいただきどうもありがとうございます。感謝してもきりがありません。 可能でしたら、個人的に謝意を表したいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問