【Python基礎】osモジュールによるフォルダ間移動とファイル名取得(絶対パスと相対パスの違い)

  • URLをコピーしました!
目次

フォルダ間移動

前にcsvファイルの書き込みに関して説明しました。

その際はプログラムと読み込むファイルは同じフォルダにある必要があり、また新規作成されるファイルは同じフォルダに作成されました。

しかしプログラムとファイルは違うところに保存したいことだってあるでしょう。

その時にはプログラム内でフォルダを移動し、ファイルを読み込んだり、保存したりする必要があります。

今回は、そんなお話です。

まずはosモジュールをインポートします。

import os

今回もosモジュールを使用するプログラムには全て「import os」を書いておきますが、実際は1つのプログラム上では1回で大丈夫です。

必要に応じて記載してください。

まずは現在の場所を確認してみましょう。

import os

print(print(os.getcwd()))

実行結果
/Users/username/Desktop/Python/os

私の場合はデスクトップのPythonというフォルダ内のosのフォルダ内に今いるということになります。

ではPythonフォルダに移動してみましょう。

その場合には、os.chdir()というコマンドを使います。

また先ほどのos.getcwd()を使って移動前後の位置を表示させてみます。

import os

print(os.getcwd())

os.chdir("/Users/username/Desktop/Python")

print(os.getcwd())

実行結果
/Users/username/Desktop/Python/os
/Users/username/Desktop/Python

ちゃんと移動できました。

でもまだ本当に移動しているかちょっと心配ですよね。

一度、プログラムのあるフォルダに新しく適当なフォルダを作ってください。

私は先ほどのosフォルダの中に「test」というフォルダを作りました。

そしてPythonでtestフォルダまで移動して、「os_test.txt」というテキストファイルを作成してみます。

import os

os.chdir("/Users/username/Desktop/Python/os/test")

f = open("os_test.txt", "w")

f.close()

ちゃんとtestフォルダの中に、os_test.txtが作成されました。

こうやってあっちこっち移動できるようになると、プログラムの中で今、自分がどこにいるのかが重要になってくるので、今の場所を意識しながらプログラミングするようにすると良いです。

絶対パスと相対パス

先ほどフォルダを移動する時、”/Users/username/Desktop/Python/os/test”と書きました。

これは絶対パスと呼ばれ、記憶媒体(HDDやSSD)の中でどこの位置に存在するか全ての情報を詰め込んだパスになります。

いわゆる住所と同じで、国、都道府県、市区町村、番地、建物名まで書かれていると思ってもらえれば大丈夫です。

またパスの指定の仕方にはもう1つ相対パスという方法があります。

相対パスは今いる位置を中心に、どういう位置に存在するかと指定する方法です。

先ほどの住所ではなく、「うちから右へ2軒隣の家」といった感じです。

今、ファイル構造が”/Users/username/Desktop/Python/os/test”となっているとします。

また現在いるところはosフォルダだとします。

つまり絶対パスは”/Users/username/Desktop/Python/os”です。

ここで相対パスを使って、testフォルダに移動し、さらにosフォルダに戻ってきます。

import os

print(os.getcwd())

os.chdir("test")

print(os.getcwd())

os.chdir("../")

print(os.getcwd())

実行結果
/Users/username/Desktop/Python/os
/Users/username/Desktop/Python/os/test
/Users/username/Desktop/Python/os

ちゃんと最初がosフォルダ、次にosフォルダ内のtestフォルダ、最後にosフォルダへと移動できています。

つまり今いるフォルダ内のフォルダに移動する場合には、そのフォルダ名を指定してやればよく、1つ戻る(上のフォルダとも言います)場合には、”../”(2つのピリオドとスラッシュ)とすれば良いのです。

ちなみに現在いるフォルダを指定する場合は”./”(1つのピリオドとスラッシュ)とします。

もちろん2つ先のフォルダに移ることも可能です。

import os

print(os.getcwd())

os.chdir("../../")

print(os.getcwd())

os.chdir("./Python/os/test")

print(os.getcwd())

実行結果
/Users/username/Desktop/Python/os
/Users/username/Desktop
/Users/username/Desktop/Python/os/test

いくつか先の下位のフォルダに移動するためには、”./Python/os/test”の最初の ./ を忘れないようにしてください。

もし ./ を忘れると現在の場所からの相対パスではなく、絶対パスで/Python/os/test だと認識してしまいます。

また絶対パスで指定する場合は、エラーが起こりにくいですが、相対パスを指定する場合は、移動してしまった状態がプログラム上で残ってしまいます。

もし下記のようなファイルがないよとエラーが出る場合は、カーネルを再起動してみてください。

---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-XX-XXXXXXXXXXXX> in <module>
      5 print(os.getcwd())
      6 
----> 7 os.chdir("./Python/os/test")
      8 
      9 print(os.getcwd())

FileNotFoundError: [Errno 2] No such file or directory: './Python/os/test'

カーネル再起動に関してはこちら。

またファイルを新規作成とか保存する際にも、相対パスで指定することもできます。

import os

print(os.getcwd())

f = open("./test/os_test2.txt", "w")

f.close()

実行結果
/Users/username/Desktop/Python/os

確かに保存できています。

絶対パスも相対パスも使い勝手が違うので、使い分けするのがいいと思います。

私の場合は、プログラムの最初の方で絶対パスを指定して、位置を間違いなく確定しておいて、ファイルの読み込みや保存は相対パスを使うという使い分けをしています。

そのうち、データ取得や解析に関しても解説する予定なので、その時にちらっと思い出していただければいいかと思います。

フォルダ名、ファイル名取得

あるフォルダの中にあるフォルダ名、ファイル名を取得するには、os.listdir()を使います。

先ほどのosフォルダ内にあるフォルダとファイルを表示させてみます。

import os

os.chdir("/Users/username/Desktop/Python/os")

print(os.listdir("./"))

実行結果
['.DS_Store', 'test', 'os_test.ipynb', '.ipynb_checkpoints']

os.listdir()ではそのフォルダ内にあるフォルダ名、ファイル名をリスト化してくれます。

ちなみに.DS_StoreはMacで自動で作られるファイルですので気にしないでください。

また.ipynb_checkpointsはJupyter notebookが自動保存するためのフォルダですので、こちらも気にしないでください。

ファイル名が . で始まるものは隠しファイルで、通常見ることができないファイルです。

つまり、.DS_Storeと.ipynb_checkpointsは通常隠れていて、Finderでは見えないものです。

次に移る前に、ちょっと準備をします。

testフォルダに移動して、2つ空のcsvファイルを作成します。

import os

os.chdir("/Users/username/Desktop/Python/os/test")

f = open("os_csv_test.csv", "w")
f.close()

f = open("os_csv_test2.csv", "w")
f.close()

そしてtestフォルダ内のファイル名を表示してみます。

import os

os.chdir("/Users/username/Desktop/Python/os/test")

print(os.listdir())

実行結果
['os_csv_test2.csv', '.DS_Store', 'os_csv_test.csv', 'os_test.txt', 'os_test2.txt']

先ほど説明した.DS_Storeは気にせず、このフォルダには、テキストファイル(.txt)とcsvファイル(.csv)の2種類のファイルがあります。

この中で、例えばcsvファイルだけ取得したい場合は、条件分岐のif文を用いて、取得することができます。

import os

os.chdir("/Users/username/Desktop/Python/os/test")

for f in os.listdir():
    if f[-4:] == ".csv":
        print(f)

実行結果
os_csv_test2.csv
os_csv_test.csv

for f in os.listdir(): で、現在いるフォルダのファイル名を1つずつ取得し、f に代入します。

その後、if f[-4:] == “.csv”: でもしファイル名の後ろ4文字が .csv かどうかを確認し、 .csv の場合はprint(f)でファイル名を出力しています。

実際はファイル名を出力するよりも、リスト化することの方が多いと思いますのでその方法も記載しておきます。

import os

os.chdir("/Users/username/Desktop/Python/os/test")

csv_file = []

for f in os.listdir():
    if f[-4:] == ".csv":
        csv_file.append(f)
        
print(csv_file)

実行結果
['os_csv_test2.csv', 'os_csv_test.csv']

csv_fileという空のリストを作成し、取得したファイル名をそのリストに格納しました。

これでcsvファイルのみファイル名を取得することができます。

また拡張子(.csv)がいらない場合は以下の通りにします。

import os

os.chdir("/Users/username/Desktop/Python/os/test")

csv_file = []

for f in os.listdir():
    if f[-4:] == ".csv":
        csv_file.append(f[:-4])
        
print(csv_file)

csv_fileのリストに格納する際、f[:-4]とすることで、後ろから4文字を削って、格納することができます。

とりあえずフォルダ間を移動したり、ファイル名を取得したりはこんな感じです。

次回はBunchと呼ばれる辞書に関して解説をしていきます。

ということで今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次