Pathlibモジュールを使用してPython3でファイルシステムパスを操作する方法
著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
Python 3には、オペレーティングシステムに関係なくファイルシステムパスを操作するためのpathlibモジュールが含まれています。 pathlib
はos.pathモジュールに似ていますが、pathlib
は、os.path
よりも高いレベルの(多くの場合、より便利な)インターフェースを提供します。
階層的なパスを持つコンピューター上のファイルを識別できます。 たとえば、次のパスを持つコンピューター上のファイルwave.txt
を識別する場合があります:/Users/sammy/ocean/wave.txt
。 オペレーティングシステムは、パスの表現が少し異なります。 Windowsは、C:\Users\sammy\ocean\wave.txt
のようにwave.txt
ファイルへのパスを表す場合があります。
pathlib
モジュールは、Pythonプログラムで、ファイルシステム上でファイルを作成または移動する場合、ファイルシステム上で特定の拡張子またはパターンにすべて一致するファイルを一覧表示する場合、またはオペレーティングシステムに適切なファイルパスを作成する場合に役立ちます。生の文字列のコレクション。 他のツール(os.path
モジュールなど)を使用してこれらのタスクの多くを実行できる場合もありますが、pathlib
モジュールを使用すると、これらの操作を高度な可読性と最小限の量で実行できます。コードの。
このチュートリアルでは、pathlib
モジュールを使用してファイルシステムパスを表現および操作するいくつかの方法について説明します。
前提条件
このチュートリアルを最大限に活用するには、Python3でのプログラミングにある程度精通していることをお勧めします。 必要な背景情報については、次のチュートリアルを確認できます。
Path
インスタンスの構築
pathlib
モジュールはいくつかのクラスを提供しますが、最も重要なものの1つはPath
クラスです。 Path
クラスのインスタンスは、コンピューターのファイルシステム上のファイルまたはディレクトリへのパスを表します。
たとえば、次のコードは、wave.txt
ファイルへのパスの一部を表すPath
インスタンスをインスタンス化します。
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
のようになります。
現在、wave
変数に割り当てられているPath
オブジェクトには、相対パスが含まれています。 つまり、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.home()
とPath("fish", "shark.txt")
)と文字列("ocean"
および"animals"
)。 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
コードは最初に、wave.txt
という名前のファイルを指すPath
インスタンスを作成します。 次に、wave
でwith_name
メソッドを呼び出して、tides.txt
という名前の新しいファイルを指す2番目のPath
インスタンスを返します。 パスのocean/
ディレクトリ部分は変更されず、最終パスはocean/tides.txt
のままになります。
祖先へのアクセス
特定のパスを含むディレクトリにアクセスすると便利な場合があります。 例を考えてみましょう:
shark = Path("ocean", "animals", "fish", "shark.txt") print(shark) print(shark.parent)
このコードを実行すると、次のような出力が返されます。
Outputocean/animals/fish/shark.txt ocean/animals/fish
Path
インスタンスのparent
属性は、指定されたファイルパスの最も直接の祖先を返します。 この場合、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
にもう一度アクセスすることで、さらに高いレベルを通過しました。 shark.txt
から2つ上のディレクトリは、ocean/animals
ディレクトリです。
Globを使用してファイルを一覧表示する
Path
クラスを使用して、glob
メソッドを使用してファイルを一覧表示することもできます。
次のようなディレクトリ構造があったとしましょう。
└── ocean ├── animals │ └── fish │ └── shark.txt ├── tides.txt └── wave.txt
ocean
ディレクトリには、ファイルtides.txt
およびwave.txt
が含まれています。 ocean
ディレクトリ、animals
ディレクトリ、およびfish
ディレクトリの下にshark.txt
という名前のファイルがネストされています:ocean/animals/fish
。
ocean
ディレクトリ内のすべての.txt
ファイルを一覧表示するには、次のように言うことができます。
for txt_path in Path("ocean").glob("*.txt"): print(txt_path)
このコードは、次のような出力を生成します。
Outputocean/wave.txt ocean/tides.txt
"*.txt"
グロブパターンは、.txt
で終わるすべてのファイルを検索します。 コードサンプルはocean
ディレクトリでそのグロブを実行するため、ocean
ディレクトリにある2つの.txt
ファイルwave.txt
とtides.txt
を返します。 ]。
注:この例に示されている出力を複製する場合は、コンピューターにここに示されているディレクトリ構造を模倣する必要があります。
glob
メソッドを再帰的に使用することもできます。 ocean
ディレクトリ内のすべての.txt
ファイルとそのすべてのサブディレクトリを一覧表示するには、次のように言うことができます。
for txt_path in Path("ocean").glob("**/*.txt"): print(txt_path)
このコードを実行すると、次のような出力が返されます。
Outputocean/wave.txt ocean/tides.txt ocean/animals/fish/shark.txt
globパターンの**
部分は、このディレクトリとその下のすべてのディレクトリに再帰的に一致します。 したがって、出力にwave.txt
ファイルとtides.txt
ファイルがあるだけでなく、ocean/animals/fish
の下にネストされたshark.txt
ファイルも受け取ります。
相対パスの計算
Path.relative_to
メソッドを使用して、相互に関連するパスを計算できます。 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
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が相対パスを計算する方法はありません。
結論
pathlib
モジュールは、 Python標準ライブラリの強力な部分であり、任意のオペレーティングシステムでファイルシステムパスをすばやく操作できます。 このチュートリアルでは、pathlib
の主要なユーティリティのいくつかを使用して、ファイル属性にアクセスしたり、globパターンでファイルを一覧表示したり、親ファイルやディレクトリをトラバースしたりする方法を学びました。
pathlib
モジュールは、このチュートリアルでは取り上げなかった追加のクラスとユーティリティを公開します。 ベースラインができたので、 pathlibモジュールのドキュメントを使用して、他の利用可能なクラスとユーティリティについて詳しく知ることができます。
他のPythonライブラリの使用に興味がある場合は、次のチュートリアルを確認してください。