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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

802閲覧

IndexError: list index out of range

yamahitsuji

総合スコア2

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/07/04 16:34

前提・実現したいこと

こちらの動画のように、x_trainの数字データを取り出せるようにしたいです。

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

IndexError Traceback (most recent call last) <ipython-input-136-55a7ed6664bb> in <module> 13 img_data = tf.image.resize(img_data,[100,100]) 14 ---> 15 if f.split("/")[2] == "train": 16 x_train.append(img_data) 17 elif f.split("/")[2] == "test": IndexError: list index out of range

該当のソースコード

python

1import numpy as np 2import tensorflow as tf 3import glob 4 5x_train= [] 6y_train= [] 7x_test= [] 8y_test= [] 9 10for f in glob.glob(".keras/image/*/*/*.jpg"): 11 img_data = tf.io.read_file(f) 12 img_data = tf.io.decode_jpeg(img_data) 13 img_data = tf.image.resize(img_data,[100,100]) 14 15 if f.split("/")[2] == "train": 16 x_train.append(img_data) 17 elif f.split("/")[2] == "test": 18 x_test.append(img_data) 19 y_test.append(int(f.split("/")[3].split(r"_")[0])) 20 21 x_train=np.array(x_train)/ 255.0 22 y_train=np.array(y_train) 23 x_test=np.array(x_test)/ 255.0 24 y_test=np.array(y_test)

試したこと

他の方がif f.split("/")[2] == "train":の("/")を("//")したらできたといっていたので試してみましたが、同じ内容のエラーメッセージが表示されました。

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

実行はJupiternotebookで行っています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問文からセパレータかなあと思っていますが、Pythonの実行環境がWindowsだったりしませんか?
って事で、書きます。

初動は現状確認、次に予測と検証

エラーが出ただけでは足りなくて、読んで内容を把握する必要があります。
英語が読めなければGoogle翻訳でいいので、エラーメッセージをちゃんと読む

---> 15 if f.split("/")[2] == "train":
IndexError: list index out of range

① エラーメッセージから配列の範囲外にアクセスしたんだなと考え、f.split("/")[2]は存在しないと予測します。
fには何が入っているのかと考え、デバッガを使うかJupyterNotebookならprint(f)でも入れて確認でしょうか

先に②に着眼して、①を導き出しても良いかと思います。

対策案を考える

すぐ気が付くと思いますので、それを踏まえて対策してください。

ヒント

osパッケージにはファイルセパレータ定義を取る機能があります。

Python 標準ライブラリ » 汎用オペレーティングシステムサービス » os --- 雑多なオペレーティングシステムインタフェース
https://docs.python.org/ja/3/library/os.html?highlight=os%20sep#os.sep

投稿2021/07/04 18:34

neonemo

総合スコア191

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

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

yamahitsuji

2021/07/04 23:42

実行環境はwindowsです。 print(f)をしてみたところ.keras/image\test\0_apple\apple1.jpgなどのイメージファイルが入っていることが分かったのですが、"/"と"\"で区切られていてf.split("/")[2] == "test":のところをどう直したらいいのかわかりませんでした。 また、教えていただいたことを参考にf.os.path.split("\")[1] == "train":と変えてみたのですが、AttributeError: 'str' object has no attribute 'os'というエラーが表示されました。 strオブジェクト属性にosがないということだったので、import osとしてみましたが変化はありませんでした。 この対処方法も教えていただけると助かります。
neonemo

2021/07/05 03:36 編集

パッケージの理解が浅そうですので、ヒント部分は一旦忘れて下さい。 osはパッケージであって、文字列の配下にある機能ではないです。 なので【f.os.path.split("\")】は【f.split("\")】のままで良いです。 ちなみにヒントについては【os.path】ではなく【os.sep】を提示したつもりでした。 思ったようにデバッグが進まないようなので、デバッグの進め方について。 基本は、 ① 現状の確認・観察 ② ①で起こっている事を推測し、裏付ける ③ ②の対処法を考え、実践する(①に戻る) ですが、これは複数の対処をまとめてやってはいけません。 まとめて変えてしまうと、どの変更により、どう挙動が変わるのかが曖昧になる為です。 今回であれば ① 【print(f)】によって【"/"と"\"で区切られていて】と気が付いたので もう少し考えを深く掘り下げて ② 何故、2つの文字で区切られているのか? 普段使いのWindowsのエクスプローラでファイルを見る時はそんなの見た事ないけど…おかしいぞ。調べてみよう 検索キーワード : windows ファイル名 分割 文字 https://www.google.com/search?q=windows+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D+%E5%88%86%E5%89%B2+%E6%96%87%E5%AD%97&oq=windows+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D+%E5%88%86%E5%89%B2+%E6%96%87%E5%AD%97&aqs=chrome..69i57.11896j0j7&sourceid=chrome&ie=UTF-8 ③ もしかして、最初に指定しているワイルドカード入りのパス指定方法が間違ってないか? ここだけ検証コードを書いて確認してみよう。 …とこんな具合です。 上手く対処すると、分割文字は1つに減らせるかもしれません。 ただ、実際の開発現場だと複数の現象が絡み合って起こる不具合現象もありますので、 面倒でも1つの現象に対して①~③を繰り返していくのが重要です。 (少なくとも天才でも、経験があるわけでもない間は) 仕事が終わった夜にまた覗きに来るので頑張ってください。
yamahitsuji

2021/07/06 13:11

何とか解決出来ました!ありがとうございました!!
neonemo

2021/07/06 14:17

おめでとうございます。 それではどのようなコードを書いて解決したのか等、質問文を修正して追記をお願いします。 teratailは後進の為のナレッジの側面がありますので。 お手数ですがよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問