著者は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ライブラリの使用に興味がある場合は、次のチュートリアルを確認してください。