Pathlibモジュールを使用してPython3でファイルシステムパスを操作する方法

提供:Dev Guides
移動先:案内検索

著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

Python 3には、オペレーティングシステムに関係なくファイルシステムパスを操作するためのpathlibモジュールが含まれています。 pathlibos.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インスタンスを作成します。 次に、wavewith_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.txttides.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ディレクトリを基準にして、次にoceananimalsの両方を基準にして計算します。ディレクトリ。

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/pathocean/animals/fish/shark.txtの一部ではないため、Pythonが相対パスを計算する方法はありません。

結論

pathlibモジュールは、 Python標準ライブラリの強力な部分であり、任意のオペレーティングシステムでファイルシステムパスをすばやく操作できます。 このチュートリアルでは、pathlibの主要なユーティリティのいくつかを使用して、ファイル属性にアクセスしたり、globパターンでファイルを一覧表示したり、親ファイルやディレクトリをトラバースしたりする方法を学びました。

pathlibモジュールは、このチュートリアルでは取り上げなかった追加のクラスとユーティリティを公開します。 ベースラインができたので、 pathlibモジュールのドキュメントを使用して、他の利用可能なクラスとユーティリティについて詳しく知ることができます。

他のPythonライブラリの使用に興味がある場合は、次のチュートリアルを確認してください。