【解決】図で分かるわかりやすいFileNotFoundError (pwdとcd) ※ディレクトリとファイルの関係

FileNotFoundError... Python

前提

使用言語:Python
環境:JupyterLab, Google Colaboratory
OS:Mac
※FileNotFoundErrorが発生する原理、用語の解説などもしています

FileNotFoundError

Pythonでデータ処理を行う際、まずはデータの読み込みから話を始めるはずです。
しかしそこで現れる第一の関門。初心者の出鼻を挫くエラー。

それこそがFileNotFoundError。以下のようなエラー表示を見たことがあるはず。

JupyterLab
Google Colaboratory

FileNotFoundErrorを訳すと、「ファイルが見つかりません」というものになります。
すなわち、上記画像の下部にある赤枠で囲んだ部分を訳すと、
ファイルが見つかりません:”sampleデータベース.xlsx”という名前のファイルまたはディレクトリはありません
ということになります。(今回は”sampleデータベース”という名前のエクセルファイルを読み込みたい)

そもそもなぜFileNotFoundErrorが起こるのか?

そもそもなぜFileNotFoundErrorが起こるのかについて、簡単に言えば
コンピュータは、自身が存在するディレクトリに存在するデータ(ファイル)しか読み込むことができないから
ということに尽きます。

どういうことかを図を用いて説明します。

まず、我々がコンピュータ上で扱うデータ(ファイル)というものは、ディレクトリ(フォルダ)というものの中に存在します。(厳密には”ディレクトリ=フォルダ”ではないですが、ここではイコールと考えてもらって構いません)

ディレクトリには様々なデータが入っており、単なるエクセルファイルなどの数値がまとまっているものに限らず、画像や動画などもデータとして入っています。

ここで、ディレクトリの中にもディレクトリがあるという、いわばマトリョーシカのような形が存在することに注意を払ってもらいたいです。(図で表すと以下)

もちろん、ディレクトリの中のディレクトリの中の、さらにそのディレクトリの中の…というように続けていくことも可能です。(今回で言えば、”全データを集約したディレクトリ”の中の”エクセルファイルが入っているディレクトリ”の中にさらにディレクトリを作るなど)

ここで、上記ディレクトリとデータ(ファイル)との関係を別の図として書き換えたものを以下に貼ります。(上記図と同じものです

このディレクトリとデータ(ファイル)を線で結んだ図のことを”木構造(ツリー構造)”、もしくは”階層構造”と呼びます。※”階層”という言葉については後ほどまた出てきます

ここまでの話で結局何が言いたかったんだというと、
コンピュータは、自身が存在するディレクトリにあるものにしか操作を行うことができない
ということです。

これを言い換えると、(最初の結論部分)
コンピュータは、自身が存在するディレクトリに存在するデータ(ファイル)しか読み込むことができない
ということです。


例を用いて説明します。

今、以下A、B、Cのディレクトリがあるとして、コンピュータ君はAというディレクトリにいるとします。

このとき、コンピュータ君はディレクトリB、C、Dに対して、何がしかの操作をすることができます。

しかしここで注意が必要なのが、
コンピュータ君はBの中にあるエクセルファイル、Cの中にある画像ファイル、Dの中にある動画ファイルには触れることができない(操作を行うことができない)
ことです。(以下図)

したがって、ディレクトリBの中にあるエクセルファイル、ディレクトリCの中にある画像、ディレクトリDの中にある動画に対して何某かの操作をしたい場合には、コンピュータ君がいる場所を移動させる必要があります
例えば今回は、コンピュータ君をBというディレクトリに移動させます。

これによって、コンピュータ君はBというディレクトリの中のエクセルファイルに触れることができるようになります。(Bというディレクトリの中のエクセルファイルに操作を行うことができる)

ただしこれまた注意が必要なのが、Bというディレクトリに存在するコンピュータ君は、Bというディレクトリの中のエクセルファイルには触れることはできますが、CというディレクトリとDというディレクトリには触れることができません。
(もちろん、CとDの中にある画像や動画にも触れることができない)

つまり、なぜFileNotFoundErrorが起こるのかについては、
コンピュータ君がAにいるのに、Bの”中の”エクセルファイルを読み込みたい。
コンピュータ君がBにいるのに、Cの”中の”動画を開きたい
といった事態が生じているからです。
僕がいる位置からじゃそれは操作できません、そのデータは一体どこにあるんですか?とコンピュータ君が言っている)

したがってその解決方法としては、
自分が操作をしたいと考えるデータ(ファイル)が存在するディレクトリにコンピュータを移動させる
です。

用語の説明とコマンド

実際にFileNotFoundErrorを解決するにあたって、まずはディレクトリとファイルの文脈で語られるコンピュータ用語をまとめます。(後ほど用語を使って説明をするので、逐次読み返していただく形でも問題ありません)

そしてその次に、”コマンド”と呼ばれるコンピュータへの命令を行う操作を解説します。

ディレクトリとファイルの文脈で語られるコンピュータ用語

カレントディレクトリ(作業ディレクトリ)

カレントディレクトリ(別名:作業ディレクトリ)は、前のコンピュータ君の例でいうところの、コンピュータ君が現在いる場所のことを指します。(Current Directoryということで、直訳すると”現在のディレクトリ”)

例えば以下図であれば、カレントディレクトリはAです。

以下図であれば、カレントディレクトリはBです。

上の階層に上る、下の階層に下る

ディレクトリとデータ(ファイル)を線で結んだ図のことを”階層構造”と呼ぶとして紹介しましたが、その図において”上の階層に上る“、”下の階層に下る“ということが何を意味するのかについて、例を用いて説明します。

例えば今、カレントディレクトリがCである場合、以下図において
上の階層に上る = CからAに移動する
下の階層に下る = CからFに移動する
ということを意味します。

第1階層、第2階層、第3階層…

上の階層に上る、下の階層に下るの2つに関して、階層構造全体を見て、第1階層、第2階層、第3階層…のような形で階層を考えることができます。
例えば以下図においては、Aは第1階層、BとCとDは第2階層、EとFとGは第3階層と言えます。

※注意:Aよりも上の階層にさらにディレクトリA’が存在した場合には、そのA’が第1階層、Aが第2階層、BとCとDが第3階層、EとFとGが第4階層となります。

ルートディレクトリ

ルートディレクトリは、階層構造の一番上にあるディレクトリのことを指します。

無論、Aよりも上の階層にさらにディレクトリA’が存在した場合には、そのA’がルートディレクトリになります。

サブディレクトリ

サブディレクトリは、あるディレクトリの1つ下のディレクトリ、もしくはあるディレクトリの下にある全てのディレクトリのことを指します。

例えば今、Cを基準にサブディレクトリを考える場合、以下図においてサブディレクトリは、
F もしくはF、H、I がそれに当たります。

これに関して、ルートディレクトリを基準にして考える場合には、ルートディレクトリより下の階層にある全てのディレクトリをサブディレクトリとして扱う場合もあります。(上の図で言えば、ルートディレクトリがAなので、それ以外のB、C、D、E、F、G、H、I は全てサブディレクトリとして扱います)

親ディレクトリ、子ディレクトリ、孫ディレクトリ

あるディレクトリの1つ上のディレクトリを親ディレクトリ、そのディレクトリの1つ下のディレクトリを子ディレクトリ、さらにその子ディレクトリの1つ下のディレクトリを孫ディレクトリと呼びます。

ここでは実用上、カレントディレクトリを基準にして親、子、孫ディレクトリを考えます。
例えば今、カレントディレクトリがCである場合、以下図において
親ディレクトリ = A
子ディレクトリ = F
孫ディレクトリ = H、I
となります。

コマンド:コンピュータへの命令を行う操作

なぜFileNotFoundErrorが起こるのかについてとその解決策は既に述べた通りで、したがって
今必要なことは、コンピュータを自分が操作をしたいと考えるデータ(ファイル)が存在するディレクトリに移動させるという命令を下すことです。

用語を用いて言い換えると、自分が操作をしたいと考えるデータ(ファイル)が存在するディレクトリをカレントディレクトリにするという命令を下す必要があります。


以下、例を用いて説明します。

今、カレントディレクトリがAである場合にディレクトリEにあるエクセルファイルを読み込みたいと考えたとき、読み込めないという事態があるとします。

すなわち、ディレクトリAにいたコンピュータ君は、ディレクトリBしか操作をすることができないので、そのBの中にあるEにまで、はたまたEの中にあるエクセルファイルにまで手を伸ばすことができません。(Aにいるコンピュータ君からは、Bしか見えていない)

ここで、カレントディレクトリをEにする、すなわち A → E というようにコンピュータのカレントディレクトリを移動させます。

これによって、ディレクトリEにあるエクセルファイルを読み込むことができるようになります。(Eにいるコンピュータ君からは、Eの中にあるエクセルファイルが見える)

上記、階層を移動させる、すなわちディレクトリを移動させるという命令などを含んだコンピュータ君にかける命令全般を”コマンド“と言います。
ここでは、
・現在地の確認
・下の階層に下る
・上の階層に上る
の3つのコマンドを紹介します。

※補足:コマンドを実行するときには、「”コマンドの用語”を叩いて〜」という言い方をする場合があります。例えば以下、pwdとcdというコマンドを説明しますが、cdコマンドをやってほしいときに、「cdを叩いて〜」という言い方をする場合があります。

pwd:現在地を返してくれ

まず、コンピュータ君に対して”現在地を返してくれ”という命令を下すコマンドを紹介します。なぜ現在地の確認(カレントディレクトリの確認)から話を始めるのかというと、
そもそも今コンピュータ君がどこのディレクトリにいるかも分からないのに、下の階層なり上の階層に行きなさいという命令を下せるはずもないからです。

“現在地を返してくれ”というコマンドは、”pwd“です。
これは Present Working Directory の頭文字をとったもので、意味は、”今作業しているディレクトリ”です。

では実際の例を用いて確認してみます。
まず、階層構造は以下図のようになっています。(結構リアルに書いてます)

そして、現在のコンピュータ君の位置は…

左上にいました!(↓)
※隠している部分は使用しているPCによって異なりますが特に気にしないでok

cd:指定したディレクトリに行きなさい

次に、コンピュータ君に対して”指定したディレクトリに行きなさい”という命令を下すコマンドを紹介します。これを使うことによって、下の階層に下る、上の階層に上るという2つの命令を下すことができるようになります。

“指定したディレクトリに行きなさい”というコマンドは、”cd 指定したディレクトリ“です。
これは Change Directory の頭文字をとったもので、意味はそのままですね。

実例としては、今やりたいこととそれに関してやるべきことをまとめてから、 確認してみます。

今やりたいこと

“図で分かるわかりやすいFileNotFoundError”という名前のディレクトリの中の、”sampleデータベース.xlsx”というエクセルファイルを読み込むこと

やるべきこと

Step1. カレントディレクトリである”Documents”から”wordpress”という名前のディレクトリに下る

Step2. そこからさらに”図で分かるわかりやすいFileNotFoundError”という名前のディレクトリに下る

Step3. そしてそこで、”sampleデータベース.xlsx”というエクセルファイルを読み込む

上記Stepの順にやっていきます。
※一応ですが、カレントディレクトリが”Documents”であるコンピュータ君に対して、”図で分かるわかりやすいFileNotFoundError”の中の”sampleデータベース.xlsx”というエクセルファイルを読み込んでくれ!という命令を出してみて、FileNotFoundErrorが出るかを確認しておきます

コマンド

エラー、出ましたね。ではStepにしたがって解決していきましょう。

まずは、Step1. カレントディレクトリである”Documents”から”wordpress”という名前のディレクトリに下る。
以下、Documents → wordpress(への移動)

コマンド

次に、Step2. “図で分かるわかりやすいFileNotFoundError”という名前のディレクトリに下る。
以下、wordpress → 図で分かるわかりやすいFileNotFoundError(への移動)

コマンド

上記コマンドを行うことによって、カレントディレクトリである”Documents”から”wordpress”という名前のディレクトリに下り、そこからさらに”図で分かるわかりやすいFileNotFoundError”という名前のディレクトリに下ることに成功しました。

最後、Step3. “sampleデータベース.xlsx”というエクセルファイルを読み込む
以下、”sampleデータベース.xlsx”の読み込み

Pythonコード

以上で、やりたいことを完遂することができました。

cdで下の階層に下ることはやったけど、上の階層に上ることはやってないやん!そっちも解説を!

すみません少し待ってください。以下の補足の次で解説します。


補足として、実はStep1.とStep2.の処理はまとめることができます。
以下、Documents → wordpress → 図で分かるわかりやすいFileNotFoundError(への移動)

コマンド

上記のように、”/”記号(スラッシュと読みます)を入れることによって、Step1.とStep2.を同時に行うことができました。

1つの疑問と検証

エクセルファイルが存在するディレクトリにコンピュータ君を移動させることができ、無事にFileNotFoundErrorを解決することができるようになりましたが、1つだけ疑問があるとすると…

もし降りる階層を間違えてしまったらどうするの?リカバリーは可能?

というところでしょうか。これに対しては、無論、リカバリーは可能です。
例えば以下のパターンを考えてみます。

先ほどとやりたいことは同様、
“図で分かるわかりやすいFileNotFoundError”というディレクトリの中の”sampleデータベース.xlsx”のエクセルファイルを読み込みたい
のですが…
間違えて「Documents → wordpress → 画像」というようにコンピュータ君を移動させてしまいました。このままでは本来の目的を達成できそうにありません。
(sampleデータベース.xlsx は “画像” という名前のディレクトリの中には無いので、このままではFileNotFoundErrorが発生する)

ではどうするのかというと、“画像”というディレクトリから “wordpress”のディレクトリに上り、そこから再度 “図で分かるわかりやすいFileNotFoundError”のディレクトリに下ります

上記、”画像”というディレクトリから”wordpress”というディレクトリへの移動をする際のコマンド、すなわち1つ上の階層に上るコマンドとしては、以下を叩けばokです。(cdを叩く〜)

cd ..

実際に確かめてみると…

コマンド

“画像”というディレクトリから、”wordpress”というディレクトリに移動することができました。

タイトルとURLをコピーしました