今日は、パス結合の際に使われる、os.path.join()について説明いたします。
今回の記事では、
今いるディレクトリにファイルを追加するにはどうすれば良いの?
os.path.join()って何?
といった疑問をお持ちの方へ向けて、
- 【基礎】os.path.join()とは
- 【基礎】join()の活用法
- 【応用】join()の注意点と対策
以上の3つに分けて解説致します!
join()はファイルを作成する際などに必要となることが多いので、ここで是非使い方を覚えていってください!
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
os path joinとは
パス名操作に関する処理をまとめたモジュールに実装されている関数の一つです。引数に与えられた二つの文字列を結合させ、一つのパスにする事ができます。os.path.join()を使えるようにするには、osモジュールをインポートする必要があります。
実際にos.path.join()の呼び出し方と実行結果を確認してみましょう。
#! /usr/bin/env python import os print("join(): " + os.path.join("/A/B/C", "file.py"))
実行結果:
join(): /A/B/C/file.py
このように、パスとファイル名を結合させたり、分割されたパスを一つにまとめたりすることができます。以降では、より具体的な使い方について解説致します。
joinの活用法
join()を使うケースで最も多いかと思われるのは、現在のディレクトリに新しいファイルを作成するケースです。そういった際にどのように実装すれば良いか、join()との組み合わせ方を紹介します。
実行ファイルのあるディレクトリに新しいファイルを作る
まずはじめに、join()を呼び出している実行ファイルのあるディレクトリに新しいファイルを作成する方法です。実行ファイルのディレクトリを取得するには、以下のように実装します。
#! /usr/bin/env python import os print("join(): " + os.path.join(os.path.abspath(os.path.dirname(__file__)), "file.py"))
ここでは、以下のようなことが行われています。
2. “os.path.dirnam”で実行ファイルの相対パスを示し
3. “os.path.abspat”で上記のパスを絶対パスに変換する
これを実行することで、絶対パスを取得することができます。
実行結果は、以下のようになります。
join(): /Users/XXX/Desktop/os-path-join/file.py
現在のディレクトリに新しいファイルを作る
今度は、実行ファイルではなくカレントディレクトリを参照します。スクリプトを実行した時点では実行ファイルのパスがカレントディレクトリになりますが、ディレクトリ移動などをしている場合は現在のディレクトリを取得する必要があります。
現在のディレクトリを取得する方法は、以下となります。
#! /usr/bin/env python import os print("join(): " + os.path.join(os.getcwd(), "file.py"))
上記のようにos.getcwd()で現在のディレクトリを取得できます。実行結果は”現在のディレクトリ(絶対パス)/file.py”となります。
※絶対パスとは、一番上のディレクトリからパスをすべて書いたものです。
join()の注意点
ここまでで、基礎的なjoin()の使い方は理解いただけたかと思います。続いて、join()を使う際の注意点を確認しましょう!
リストに格納されたパスを繋げる場合
リストに格納されたディレクトリ名やファイル名を繋げたい場合、どのように実装すれば良いでしょうか?
ここでは、以下のリストを結合させて”dirA/dirB/dirC/file.py”というパスを作成しましょう。
list1 = ["dirA", "dirB", "dirC", "file.py"]
ここで、まずやってしまいがちな方法が以下になります。
#! /usr/bin/env python import os list1 = ["dirA", "dirB", "dirC", "file.py"] path = os.path.join(list1) print(path)
これを実行すると以下になります。
実行結果:
['dirA', 'dirB', 'dirC', 'file.py']
リストがそのまま返ってしまいました。実は、リストをjoin()したい場合は、リストをそのまま入れてはうまく処理されません
対処法は以下になります。
#! /usr/bin/env python import os list1 = ["dirA", "dirB", "dirC", "file.py"] path = os.path.join(*list) print(path)
アスタリスクを入れるだけです!
実行結果:
dirA/dirB/dirC/file.py
期待通り処理されました。
パスにディレクトリの区切り文字が含まれる場合
続いて注意していただきたいケースは、結合するパス名にディレクトリの区切り文字(“/”など)が含まれている場合です。
以下をご覧ください。
#! /usr/bin/env python import os print(os.path.join("dirA", "dirB", "/dirC")) print(os.path.join("/dirA", "/dirB", "dirC")) print(os.path.join("/dirA", "dirB", "dirC"))
一見、どれも”/dirA/dirB/dirC”と上手く結合させてくれそうですが、実行結果は以下になります。
/dirC /dirB/dirC /dirA/dirB/dirC
実は、join()はディレクトリの区切り文字が入っていると、そこをrootとしてしまう性質があります。対処方として、まずリストの文字列を置き換えてしまう方法があります。
#! /usr/bin/env python import os path = ["/dirA", "/dirB", "/dirC"] path = [dir.replace("/", "") for dir in path] #リストの置き換え print("join(): " + os.path.join(*path))
実行結果:
join(): dirA/dirB/dirC
正常に結合できました。
まとめ
いかがでしたでしょうか?
今回の記事では、
- join()とは?
- join()の活用法
- join()の注意点
について説明させていただきました。
os.path.join()はパス操作のうえで頻出する関数である為、とても重要になります。この記事を一通り理解すればおよそjoin()は使いこなせるので、是非活用してみてください!