pathlibモジュールを使用してPython3でファイルシステムパスを操作する方法
著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
Python 3には、オペレーティングシステムに関係なくファイルシステムパスを操作するためのpathlibモジュールが含まれています。 pathlib os.pathモジュールに似ていますが、 pathlib より高いレベルの(そして多くの場合、より便利な)インターフェースを提供します os.path.
階層的なパスを持つコンピューター上のファイルを識別できます。 たとえば、ファイルを特定する場合があります wave.txt このパスを持つコンピューターの場合: /Users/sammy/ocean/wave.txt. オペレーティングシステムは、パスの表現が少し異なります。 Windowsはへのパスを表す場合があります wave.txt のようなファイル C:\Users\sammy\ocean\wave.txt.
あなたは見つけるかもしれません pathlib Pythonプログラムで次のような場合に役立つモジュール:ファイルシステムでファイルを作成または移動する、特定の拡張子またはパターンにすべて一致するファイルシステムでファイルを一覧表示する、または生の文字列のコレクションに基づいてオペレーティングシステムに適切なファイルパスを作成する。 他のツール( os.path モジュール)これらのタスクの多くを実行するために、 pathlib モジュールを使用すると、これらの操作を高度な可読性と最小限のコードで実行できます。
このチュートリアルでは、を使用するいくつかの方法について説明します。 pathlib ファイルシステムパスを表現および操作するモジュール。
前提条件
このチュートリアルを最大限に活用するには、Python3でのプログラミングにある程度精通していることをお勧めします。 必要な背景情報については、次のチュートリアルを確認できます。
構築 Path インスタンス
The pathlib モジュールはいくつかのクラスを提供しますが、最も重要なものの1つは Path クラス。 のインスタンス Path classは、コンピュータのファイルシステム上のファイルまたはディレクトリへのパスを表します。
たとえば、次のコードは Path へのパスの一部を表すインスタンス wave.txt ファイル:
from pathlib import Path
wave = Path("ocean", "wave.txt")
print(wave)
このコードを実行すると、次のような出力が返されます。
Outputocean/wave.txt
from pathlib import Path を作ります Path 私たちのプログラムで利用できるクラス。 それで Path("ocean", "wave.txt") 新しいをインスタンス化します Path 実例。 出力を印刷すると、Pythonが適切なオペレーティングシステムセパレータを追加したことがわかります。 / 私たちがそれを与えた2つのパスコンポーネントの間: "ocean" と "wave.txt".
注:オペレーティングシステムによっては、出力がこのチュートリアルに示されている出力例と若干異なる場合があります。 たとえば、Windowsを実行している場合、この最初の例の出力は次のようになります。 ocean\wave.txt.
現在、 Path に割り当てられたオブジェクト wave 変数に相対パスが含まれています。 言い換えると、 ocean/wave.txt ファイルシステムのいくつかの場所に存在する可能性があります。 例として、それはに存在する可能性があります /Users/user_1/ocean/wave.txt また /Users/user_2/research/ocean/wave.txt、しかし、私たちが参照しているものを正確に指定していません。 対照的に、絶対パスは、ファイルシステム上の1つの場所を明確に参照します。
使用できます Path.home() 現在のユーザーのホームディレクトリへの絶対パスを取得するには、次の手順に従います。
home = Path.home()
wave_absolute = Path(home, "ocean", "wave.txt")
print(home)
print(wave_absolute)
このコードを実行すると、おおよそ次のような出力が返されます。
Output/Users/sammy
/Users/sammy/ocean/wave.txt
注:前述のように、出力はオペレーティングシステムによって異なります。 もちろん、ホームディレクトリも /Users/sammy.
Path.home() を返します Path 現在のユーザーのホームディレクトリへの絶対パスを持つインスタンス。 次に、これを渡します Path インスタンスと文字列 "ocean" と "wave.txt" 別のものに Path への絶対パスを作成するコンストラクタ wave.txt ファイル。 出力には、最初の行がホームディレクトリであり、2番目の行がホームディレクトリとプラスであることが示されています。 ocean/wave.txt.
この例は、 Path クラス: Path コンストラクターは文字列と既存の両方を受け入れます Path オブジェクト。
文字列と文字列の両方のサポートを見てみましょう Path 内のオブジェクト Path コンストラクターをもう少し詳しく説明します。
shark = Path(Path.home(), "ocean", "animals", Path("fish", "shark.txt"))
print(shark)
このPythonコードを実行すると、次のような出力が返されます。
Output/Users/sammy/ocean/animals/fish/shark.txt
shark は Path 両方を使用して作成したファイルに Path オブジェクト(Path.home() と Path("fish", "shark.txt"))と文字列("ocean" と "animals"). The Path コンストラクターは両方のタイプのオブジェクトをインテリジェントに処理し、適切なオペレーティングシステムセパレーター(この場合)を使用してそれらをクリーンに結合します /.
ファイル属性へのアクセス
構築する方法を学んだので Path インスタンスについて、それらのインスタンスを使用してファイルに関する情報にアクセスする方法を確認しましょう。
使用できます name と suffix ファイル名とファイルサフィックスにアクセスするための属性:
wave = Path("ocean", "wave.txt")
print(wave)
print(wave.name)
print(wave.suffix)
このコードを実行すると、次のような出力が返されます。
Output/Users/sammy/ocean/wave.txt
wave.txt
.txt
この出力は、パスの最後にあるファイルの名前が次のようになっていることを示しています。 wave.txt そのファイルのサフィックスは .txt.
Path インスタンスはまた提供します with_name 新しいものをシームレスに作成できる機能 Path 別の名前のオブジェクト:
wave = Path("ocean", "wave.txt")
tides = wave.with_name("tides.txt")
print(wave)
print(tides)
これを実行すると、次のような出力が返されます。
ocean/wave.txt
ocean/tides.txt
コードは最初に Path 名前の付いたファイルを指すインスタンス wave.txt. 次に、 with_name 上の方法 wave 秒を返す Path 名前の付いた新しいファイルを指すインスタンス tides.txt. The ocean/ パスのディレクトリ部分は変更されず、最終パスは次のようになります。 ocean/tides.txt
祖先へのアクセス
特定のパスを含むディレクトリにアクセスすると便利な場合があります。 例を考えてみましょう:
shark = Path("ocean", "animals", "fish", "shark.txt")
print(shark)
print(shark.parent)
このコードを実行すると、次のような出力が返されます。
Outputocean/animals/fish/shark.txt
ocean/animals/fish
The parent の属性 Path instanceは、指定されたファイルパスの最も直接的な祖先を返します。 この場合、それはを含むディレクトリを返します shark.txt ファイル: ocean/animals/fish.
アクセスできます parent 指定されたファイルの祖先ツリーをトラバースするために、連続して複数回属性を設定します。
shark = Path("ocean", "animals", "fish", "shark.txt")
print(shark)
print(shark.parent.parent)
このコードを実行すると、次の出力が返されます。
Outputocean/animals/fish/shark.txt
ocean/animals
出力は以前の出力と似ていますが、アクセスすることでさらに高いレベルをトラバースしました .parent もう一度。 から2つのディレクトリ shark.txt それは ocean/animals ディレクトリ。
Globを使用してファイルを一覧表示する
使用することも可能です Path を使用してファイルを一覧表示するクラス glob 方法。
次のようなディレクトリ構造があったとしましょう。
└── ocean
├── animals
│ └── fish
│ └── shark.txt
├── tides.txt
└── wave.txt
アン ocean ディレクトリにはファイルが含まれています tides.txt と wave.txt. 名前の付いたファイルがあります shark.txt 下にネスト ocean ディレクトリ、 animals ディレクトリ、および fish ディレクトリ: ocean/animals/fish.
すべてを一覧表示するには .txt 内のファイル ocean ディレクトリ、私たちは言うことができます:
for txt_path in Path("ocean").glob("*.txt"):
print(txt_path)
このコードは、次のような出力を生成します。
Outputocean/wave.txt
ocean/tides.txt
The "*.txt" glob pattern は、で終わるすべてのファイルを検索します .txt. コードサンプルはそのグロブを実行するので ocean ディレクトリ、それは2つを返します .txt 内のファイル ocean ディレクトリ: wave.txt と tides.txt.
注:この例に示されている出力を複製する場合は、コンピューターにここに示されているディレクトリ構造を模倣する必要があります。
使用することもできます glob メソッドを再帰的に。 すべてを一覧表示するには .txt 内のファイル ocean ディレクトリとそのすべてのサブディレクトリは、次のように言うことができます。
for txt_path in Path("ocean").glob("**/*.txt"):
print(txt_path)
このコードを実行すると、次のような出力が返されます。
Outputocean/wave.txt
ocean/tides.txt
ocean/animals/fish/shark.txt
The ** globパターンの一部は、このディレクトリとその下のすべてのディレクトリに再帰的に一致します。 だから、私たちが持っているだけではありません wave.txt と tides.txt 出力にファイルがありますが、 shark.txt 下にネストされたファイル ocean/animals/fish.
相対パスの計算
使用できます Path.relative_to 相互に相対的なパスを計算する方法。 The relative_to このメソッドは、たとえば、長いファイルパスの一部を取得する場合に役立ちます。
次のコードを検討してください。
shark = Path("ocean", "animals", "fish", "shark.txt")
below_ocean = shark.relative_to(Path("ocean"))
below_animals = shark.relative_to(Path("ocean", "animals"))
print(shark)
print(below_ocean)
print(below_animals)
これを実行すると、次のような出力が返されます。
Outputocean/animals/fish/shark.txt
animals/fish/shark.txt
fish/shark.txt
The relative_to メソッドは新しいを返します Path 指定された引数に関連するオブジェクト。 この例では、 Path に shark.txt に関連して ocean ディレクトリ、そして両方に関連して ocean と animals ディレクトリ。
もしも relative_to 無関係なパスを与えるため、答えを計算できません。 ValueError:
shark = Path("ocean", "animals", "fish", "shark.txt")
shark.relative_to(Path("unrelated", "path"))
受け取ります ValueError このコードから発生した例外は次のようになります。
OutputTraceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/Python3.8/pathlib.py", line 899, in relative_to
raise ValueError("{!r} does not start with {!r}"
ValueError: 'ocean/animals/fish/shark.txt' does not start with 'unrelated/path'
unrelated/path の一部ではありません ocean/animals/fish/shark.txt、したがって、Pythonが相対パスを計算する方法はありません。
結論
The pathlib モジュールはPython標準ライブラリの強力な部分であり、任意のオペレーティングシステムでファイルシステムパスをすばやく操作できます。 このチュートリアルでは、いくつかの使用法を学びました pathlibファイル属性にアクセスし、globパターンでファイルを一覧表示し、親ファイルとディレクトリをトラバースするためのの主要なユーティリティ。
The pathlib モジュールは、このチュートリアルでは取り上げなかった追加のクラスとユーティリティを公開します。 ベースラインができたので、 pathlibモジュールのドキュメントを使用して、他の利用可能なクラスとユーティリティについて詳しく知ることができます。
他のPythonライブラリの使用に興味がある場合は、次のチュートリアルを確認してください。