本記事では、Pythonのpathlib
モジュールでパスとファイルを操作する主要なコマンドの一覧と使用例について紹介します。
目次
- はじめに
- Pathオブジェクトの基本操作
- コマンド一覧
-
パスの操作
- カレントディレクトリを取得する(Path.cwd)
- 絶対パスを取得する(Path.resolve)
- 絶対パスかどうかを確認する(PurePath.is_absolute)
- ファイル名やディレクトリ名を変更する(拡張子含む)(Path.with_name)
- ファイル名の「拡張子」を除いた部分を変更する(Path.with_stem)
- 拡張子を変更する(Path.with_suffix)
- 相対パスを取得する(PurePath.relative_to)
- パスを結合する(PurePath.joinpath)
- パスが指定したパターンに一致するかを判定する(PurePath.match)
- パスが指定したパターンに一致するかを判定する(PurePath.full_match)
- パスの状態と種類を確認する
- パスの検索または探索
- ファイルの操作
- パーミッションと所有権の取得と変更
-
パスの操作
- まとめ
はじめに
動作確認は、以下の環境で行っております。
OS: Windows 11
Python 3.13.4
Python 3.4以降で導入されたpathlib
は、パス操作を簡潔かつ直感的に記述できる非常に強力なモジュールです。特に、Pythonコードを書く際には従来のos.path
モジュールに比べて多くの利点があります。
pathlib
を使用することで次のようなメリットが得られます。
- 可読性が高い(オブジェクト指向の設計により、パス操作がより直感的に行えます)
- 区切り文字に悩まない(末尾の区切り文字や
\
と/
を意識する必要がありません) - ファイル名や拡張子の操作が簡単(パスの属性に簡単にアクセスでき、置き換えも容易です)
- クロスプラットフォーム対応(Windows、Linux、macOSのいずれでも問題なく動作します)
- パスの検索がシンプル(再帰的な検索やフィルタリングが簡単に記述できます)
以降の記事では、pathlib
の基本操作について説明した後、パスとファイルを操作するコマンドと使用例をご紹介します。
Path
オブジェクトの基本操作
まず、Path
オブジェクトの定義方法とパス属性の取得方法を示します。
オブジェクトを定義する
Path
オブジェクトは、次のように定義します。
from pathlib import Path
# Pathオブジェクトの定義
path = Path('C:\\Users\\user\\documents\\report.txt')
# パスの標準出力
print(path) # C:\Users\user\documents\report.txt
定義したPath
オブジェクトにprint
文を用いると設定されているパスが表示されます。パスを設定する際には、/
を用いてパスを結合することもできます。
from pathlib import Path
# Pathオブジェクトの定義
path = Path('C:\\') / 'Users' / 'user' / 'documents' / 'report.txt'
# パスの標準出力
print(path) # C:\Users\user\documents\report.txt
Path
オブジェクトの定義では、設定されたパスが実在するかどうかは調べませんので、存在しないパスを設定してもエラーは発生しません。
パス属性(ファイル名、拡張子など)にアクセスする
Path
オブジェクトを使用すると、パス属性(ファイル名、拡張子、親ディレクトリなど)を簡単に取得できます。
パス属性 | 取得方法 |
ファイル名(拡張子付き) | Path.name |
ファイル名の「拡張子」を除いた部分 | Path.stem |
拡張子(.txtなど1つの場合) | Path.suffix |
拡張子リスト(.tar.gzなど複数の場合) | Path.suffixes |
1つ上の親ディレクトリ | Path.parent |
親ディレクトリのリスト | Path.parents |
ルートディレクトリ | Path.root |
Windowsのドライブ | Path.drive |
ドライブとルートを結合した文字列 | Path.anchor |
パスの各部分のタプル | Path.parts |
以下に例を示します。
from pathlib import Path
# Pathオブジェクトの定義(拡張子が1つの場合)
path = Path('C:\\Users\\user\\documents\\file.txt')
print(path.name) # file.txt
print(path.stem) # file
print(path.suffix) # .txt
print(path.suffixes) # ['.txt']
print(path.parent) # C:\Users\user\documents
print(path.parent.parent) # C:\Users\user
print(path.parents[0]) # C:\Users\user\documents
print(path.parents[1]) # C:\Users\user
print(path.root) # \
print(path.drive) # C:
print(path.anchor) # C:\
print(path.parts) # ('C:\\', 'Users', 'user', 'documents', 'file.txt')
# Pathオブジェクトの定義(拡張子が複数の場合)
path = Path('C:\\Users\\user\\documents\\archive.tar.gz')
print(path.name) # archive.tar.gz
print(path.stem) # archive.tar
print(path.suffix) # .gz
print(path.suffixes) # ['.tar', '.gz']
print(path.parent) # C:\Users\user\documents
print(path.parent.parent) # C:\Users\user
print(path.parents[0]) # C:\Users\user\documents
print(path.parents[1]) # C:\Users\user
print(path.root) # \
print(path.drive) # C:
print(path.anchor) # C:\
print(path.parts) # ('C:\\', 'Users', 'user', 'documents', 'archive.tar.gz')
# Pathオブジェクトの定義(ディレクトリの場合)
path = Path('C:\\Users\\user\\documents\\')
print(path.name) # documents
print(path.stem) # documents
print(path.suffix) #
print(path.suffixes) # []
print(path.parent) # C:\Users\user
print(path.parent.parent) # C:\Users
print(path.parents[0]) # C:\Users\user
print(path.parents[1]) # C:\Users
print(path.root) # \
print(path.drive) # C:
print(path.anchor) # C:\
print(path.parts) # ('C:\\', 'Users', 'user', 'documents')
コマンド一覧
次に、よく使用するコマンドを例とともに、ご紹介します。
パスの操作
カレントディレクトリを取得する(Path.cwd
)
Path.cwd
は、「現在の作業ディレクトリ(カレントディレクトリ)」を取得するためのメソッドです。カレントディレクトリを返すPath
オブジェクトが返されます。
from pathlib import Path
path = Path.cwd() # カレントディレクトリを取得
print(path) # C:\Test\Python-Snippets\Path
絶対パスを取得する(Path.resolve
)
Path.resolve
は、指定したパスを絶対パスに解決するために使用するメソッドです。絶対パスを返すPath
オブジェクトが返されます。引数strict
(オプション)には、パスが存在しない場合やシンボリックリンクループの場合にエラーを発生させたいときはTrue
に設定します(デフォルトFalse
)
from pathlib import Path
path = Path('.\\file.txt').resolve() # 絶対パスに変換
print(path) # C:\Test\Python-Snippets\Path\file.txt
絶対パスかどうかを確認する(PurePath.is_absolute
)
PurePath.is_absolute
は、指定したパスが絶対パスであるかどうかを確認するために使用します。
from pathlib import Path
# 絶対パスの場合
path = Path('C:\\Users\\user\\documents\\file.txt')
print(path.is_absolute()) # True
# 相対パスの場合
path = Path('documents\\file.txt')
print(path.is_absolute()) # False
このメソッドは、パスが実際に存在するかどうかは確認しません。
ファイル名やディレクトリ名を変更する(拡張子含む)(Path.with_name
)
Path.with_name
は、現在のPath
オブジェクトに含まれるファイル名やディレクトリ名を指定した名前に変更して、新しいPath
オブジェクトを返します。引数name
には新しい名前を与えます。
from pathlib import Path
# ファイルパスの場合
path = Path('C:\\Users\\user\\documents\\file.txt')
new_path = path.with_name('new_file.pdf') # ファイル名の変更
print(new_path) # C:\Users\user\documents\new_file.pdf
# ディレクトリパスの場合
path = Path('C:\\Users\\user\\documents')
new_path = path.with_name('new_dir') # ディレクトリ名の変更
print(new_path) # C:\Users\user\new_dir
このメソッドは、拡張子ごとファイル名を変更します。
また、パスが実際に存在するかどうかは確認しません。
ファイル名の「拡張子」を除いた部分を変更する(Path.with_stem
)
Path.with_stem
は、現在のPath
オブジェクトに含まれるstem部分(ファイル名の拡張子を除いた部分やディレクトリ名)を変更して、新しいPath
オブジェクトを返します。引数stem
には新しいstem
部分を与えます。
from pathlib import Path
# ファイルパスの場合
path = Path('C:\\Users\\user\\documents\\file.txt')
new_path = path.with_stem('new_stem')
print(new_path) # C:\Users\user\documents\new_stem.txt
# ファイルパス(拡張子が複数)の場合
path = Path('C:\\Users\\user\\documents\\archive.tar.gz')
new_path = path.with_stem('new_stem')
print(new_path) # C:\Users\user\documents\new_stem.gz
# ディレクトリパスの場合
path = Path('C:\\Users\\user\\documents')
new_path = path.with_stem('new_stem')
print(new_path) # C:\Users\user\new_stem
このメソッドは、パスが実際に存在するかどうかは確認しません。
拡張子が複数ある場合には、最後の拡張子のみを取り除いた部分がstem
になることに注意が必要です。
拡張子を変更する(Path.with_suffix
)
Path.with_suffix
は、Path
オブジェクトの拡張子を変更して、新しい拡張子をもつPath
オブジェクトを返します。引数suffix
には新しい拡張子を与えます。
from pathlib import Path
# ファイルパスの場合
path = Path('C:\\Users\\user\\documents\\file.txt')
new_path = path.with_suffix('.pdf')
print(new_path) # C:\Users\user\documents\file.pdf
# 拡張子がない場合
path = Path('C:\\Users\\user\\documents\\')
new_path = path.with_suffix('.pdf')
print(new_path) # C:\Users\user\documents.pdf
元のパスに拡張子がない場合でも、新しい拡張子を付加したパスを返します。
新しい拡張子が空文字や、ドットを含まない形式(例えば、'.txt'
ではなく'txt'
)の場合にはエラーが発生します。
このメソッドは、パスが実際に存在するかどうかは確認しません。
相対パスを取得する(PurePath.relative_to
)
PurePurePath.relative_to
は、指定した親パスに対して、現在のパスを相対パスとして表現した新しいPath
オブジェクトを返します。引数other
には、現在のパスを相対化する基準となるパスを与えます。
from pathlib import Path
path = Path('C:\\Users\\user\\documents\\file.txt')
relative_path = path.relative_to('C:\\Users\\user')
print(relative_path) # documents\file.txt
親子関係になっていない場合は例外が発生します。例外を発生させずに、事前に親子関係を確認したい場合には、PurePath.is_relative_to
を使用します。
from pathlib import Path
path = Path('C:\\Users\\user\\documents\\file.txt')
base_path = 'C:\\Users\\guest\\'
if path.is_relative_to(base_path):
relative_path = path.relative_to(base_path)
else:
print(f'{path}は{base_path}の下にはありません。') # C:\Users\user\documents\file.txtはC:\Users\guest\の下にはありません。
このメソッドは、パスが実際に存在するかどうかは確認しません。
パスを結合する(PurePath.joinpath
)
PurePath.joinpath
は、現在のパスに対して1つ以上のパス要素を結合して新しいPath
オブジェクトを返します。引数*pathsegments
には、結合するパス要素を結合する順に1つ以上与えます。
from pathlib import Path
base_path = Path('C:\\Users\\user\\')
new_path = base_path.joinpath('documents', 'file.txt')
print(new_path) # C:\Users\user\documents\file.txt
複数のパス要素を与える場合には、リストで引数を与えることもできます。
from pathlib import Path
base_path = Path('C:\\Users\\user\\')
list = ['documents', 'file.txt']
new_path = base_path.joinpath(*list)
print(new_path) # C:\Users\user\documents\file.txt
また、他のPath
オブジェクトを引数に与えることもできます。
from pathlib import Path
base_path = Path('C:\\Users\\user\\')
new_path = base_path.joinpath(Path('documents\\file.txt'))
print(new_path) # C:\Users\user\documents\file.txt
注意点として、パス要素の途中に絶対パスを挿入すると、それ以前のパスが無視されるので注意が必要です。
from pathlib import Path
base_path = Path('C:\\Users\\user\\')
new_path = base_path.joinpath('documents', 'D:\\', 'file.txt')
print(new_path) # D:\file.txt
このメソッドは、パスが実際に存在するかどうかは確認しません。
パスが指定したパターンに一致するかを判定する(PurePath.match
)
PurePath.match
は、現在のパスが指定したパターンに一致するかどうかを判定します。パターンはglob
形式で与えられたパターンを使用できます(*, ?
など)。
第1引数pattern
に、マッチさせたいパターンを設定します。
オプション引数case_sensitive
は、True
を設定すると大文字と小文字を区別し、False
に設定すると区別しません(デフォルトNone
)。
from pathlib import Path
path = Path('C:\\Users\\user\\documents\\file.txt')
print(path.match('*.txt')) # True
print(path.match('*.pdf')) # False
print(path.match('*\\documents\\*')) # True
このメソッドは空パターンや再帰的ワイルドカード(**
)を使用できません(*
と同じ動作をします)。
これらメソッドは、パスが実際に存在するかどうかは確認しません。
パスが指定したパターンに一致するかを判定する(PurePath.full_match
)
PurePath.full_match
は、現在のパスが指定したパターンに一致するかどうかを判定します。パターンはglob
形式で与えられたパターンを使用できます(*, ?, **
など)。
PurePath.match
と使い方は同じで、空パターンや再帰的ワイルドカードを使用可能な点が異なります。Python 3.13
以降で使用できます。
from pathlib import Path
path = Path('C:\\Users\\user\\documents\\file.txt')
print(path.full_match('**\\file.txt')) # True
これらメソッドは、パスが実際に存在するかどうかは確認しません。
パスの状態と種類を確認する
パスが存在するかを確認する(Path.exists
)
Path.exists
は、指定したパスが実際に存在するかどうかを確認します。ファイルまたはディレクトリが存在する場合はTrue
を返し、それ以外の場合はFalse
を返します。
from pathlib import Path
path = Path('C:\\Users\\user\\documents\\file.txt')
print(path.exists()) # パスが存在する場合はTrue
このメソッドは通常はシンボリックリンクをたどります。シンボリックリンク自体が存在するかを確認したい場合は、引数follow_symlinks=False
(デフォルトTrue
)を設定します。
パスがファイルかを確認する(Path.is_file
)
Path.is_file
は、指定したパスがファイルかどうかを判定します。パスが存在し、かつ、それがファイルである場合にTrue
を返し、それ以外の場合はFalse
を返します。
from pathlib import Path
path = Path('C:\\Users\\user\\documents\\file.txt')
print(path.is_file()) # ファイルパスの場合はTrue
このメソッドは通常はシンボリックリンクをたどります。つまり、シンボリックリンクがファイルにリンクしている場合はTrue
を返します。
シンボリックリンクの場合に常にFalse
を返したい場合には、引数follow_symlinks=False
(デフォルトTrue
)を設定します(v3.13以上)。
パスが存在しない場合はFalse
を返します。
パスがディレクトリか確認する(Path.is_dir
)
Path.is_dir
は、指定したパスがディレクトリであるかどうかを判定します。パスが存在し、かつそれがディレクトリである場合にTrue
を返し、それ以外の場合はFalse
を返します。
from pathlib import Path
path = Path('C:\\Users\\user\\documents\\')
print(path.is_dir()) # ディレクトリパスの場合はTrue
このメソッドは通常はシンボリックリンクをたどります。つまり、シンボリックリンクがディレクトリにリンクしている場合はTrue
を返します。
シンボリックリンクの場合に常にFalse
を返したい場合には、引数follow_symlinks=False
(デフォルトTrue
)を設定します(v3.13以上)。
パスが存在しない場合はFalse
を返します。
パスがシンボリックリンクか確認する(Path.is_symlink
)
Path.is_symlink
は、指定したパスがシンボリックリンクであるかどうかを判定します。パスがシンボリックリンクである場合にTrue
を返し、それ以外の場合はFalse
を返します。
from pathlib import Path
path = Path('link')
print(path.is_symlink()) # シンボリックリンクの場合はTrue
このメソッドはシンボリックリンクのパスであれば、リンクが壊れている場合でもTrue
を返します。
パスが存在しない場合はFalse
を返します。
パスの検索または探索
ディレクトリツリーを再帰的に辿りファイルとディレクトリをリストアップする(Path.walk
)
Path.walk
は、ディレクトリツリー(フォルダ構造)をトップダウンまたはボトムアップで探索し、各ディレクトリの中身を取得できます(v3.12以上)。
関数の構造は以下のようになります。
Path.walk(top_down=True, on_error=None, follow_symlinks=False)
オプション引数top_down
は、True
の場合、ディレクトリを上から下(親ディレクトリから子ディレクトリ)に辿ります。また、False
の場合は逆に下から上に辿ります。デフォルトはTrue
です。
オプション引数on_error
は、デフォルトではエラーが無視されます。このオプションに関数を渡すと、エラーカスタム処理できます。
オプション引数follow_symlinks
は、True
の場合、シンボリックリンクを探索するリストに追加します。False
の場合には追加されません。
この関数は、3つの要素(dirpath, dirnames, filenames)
をもつタプルを返します。dirpath
は探索中のディレクトリのパス、dirnames
は探索中のディレクトリ内にあるすべてのサブディレクトリのリスト、filenames
は探索中のディレクトリ内にあるすべてのファイルのリストになります。
from pathlib import Path
path = Path('C:\\test')
for dirpath, dirnames, filenames in path.walk():
print(f'Directory: {dirpath}') # 探索中のディレクトリ
print(f'Sub-directory: {dirnames}') # 探索中のディレクトリ内のサブディレクトリのリスト
print(f'Files: {filenames}') # 探索中のディレクトリ内のファイルのリスト
print()
例えば、C:\test
内のディレクトリとファイルの構造が、
C:\test
├─Python-Projects
│ ├─ProjectA
│ └─ProjectB
└─Python-Snippets
└─Path
test.py
の場合には、次の出力が得られます。
Directory: C:\test
Sub-directory: ['Python-Projects', 'Python-Snippets']
Files: []
Directory: C:\test\Python-Projects
Sub-directory: ['ProjectA', 'ProjectB']
Files: []
Directory: C:\test\Python-Projects\ProjectA
Sub-directory: []
Files: []
Directory: C:\test\Python-Projects\ProjectB
Sub-directory: []
Files: []
Directory: C:\test\Python-Snippets
Sub-directory: ['Path']
Files: []
Directory: C:\test\Python-Snippets\Path
Sub-directory: []
Files: ['test.py']
Path.walk
を使用すると、ファイルやディレクトリのパスにdirpath / name
でアクセスでき、(dirpath / name)
にはPath
オブジェクトのメソッドを使用できます(下例)。
from pathlib import Path
path = Path('C:\\test')
for dirpath, dirnames, filenames in path.walk():
for name in filenames:
print((dirpath / name).name) # ファイル名を出力
for name in dirnames:
print((dirpath / name).name) # ディレクトリ名を出力
例えば、Path.name
の部分をPath.unlink
やPath.rmdir
メソッドに変更すると、ファイルやディレクトリを削除できます。
dirpath / name
のdirpath
とname
は、それぞれfor
文で定義された変数で、この変数名は変更することができます。
シンボリックリンクをたどるにはfollowlinks=True
に設定しますが、シンボリックリンクをたどると無限ループが発生する可能性があるため、注意が必要です。
ディレクトリ内容のPath
オブジェクトを取得する(Path.iterdir
)
Path.iterdir
は、指定したディレクトリ内の直下にあるすべてのエントリ(ファイル、ディレクトリ、シンボリックリンクなど)をイテレーターとして取得します。
イテレーターを用いて、順にエントリにアクセスすることで、それらのPath
オブジェクトを取得できます。
メソッドを使用するPath
オブジェクトには、ディレクトリパスを指定します。
from pathlib import Path
path = Path('C:\\Test\\Python-Snippets\\Path') # ディレクトリパスを指定
for entry in path.iterdir(): # ディレクトリの内容を順に取得する
print(entry) # entryはPathオブジェクト
# 指定したディレクトリ内のエントリのパス一覧が表示される
このメソッドは直下のみを対象とし、再帰的には探索しません。
シンボリックリンクがディレクトリにリンクしている場合には、シンボリックリンクのパスも指定可能です。
不正なパスが指定された場合には、エラーが発生します。
指定したディレクトリ直下をパターンで検索する(Path.glob
)
Path.glob
は、指定したディレクトリ内で指定したパターンに一致するファイルやディレクトリを探索します。
指定したパスの直下にあるエントリだけを対象にし、再帰的には探索しません(再帰的に探索する場合にはPath.rglob
を使用します)。
関数の構造は以下のようになります。
Path.glob(pattern, *, case_sensitive=None, recurse_symlinks=False)
引数pattern
には、探索するパターンを文字列で指定します(例:"*.txt"
、"file_?.py"
)
オプション引数case_sensitive
は、デフォルトでNone
が設定されています。None
を指定した場合、パスの一致判定にプラットフォームに依存した大文字小文字のルールを使用します。POSIXは大文字と小文字を区別し、Windowsは区別しません。常に区別する場合はTrue
、常に区別したくない場合はFalse
を設定します(v3.12以上)。
オプション引数recurse_symlinks
は、False
に設定した場合、このメソッドは"**"
ワイルドカードの展開時にシンボリックリンクをたどりません。True
に設定した場合には常にシンボリックリンクをたどります(c3.13以上)。
from pathlib import Path
path = Path('C:\\Test\\Python-Snippets\\Path') # ディレクトリパスを指定
for entry in path.glob("*"):
print(entry) # entryはPathオブジェクト
# ディレクトリ内のエントリのパス一覧が表示される
存在しないパスやファイルパスを指定した場合にはエラーは発生せず、何も表示されません。
指定したディレクトリを再帰的にパターン検索する(Path.rglob
)
Path.rglob
は、指定したディレクトリ内で指定したパターンに一致するファイルやディレクトリを探索します。
Path.glob
が指定したディレクトリ直下を探索するの対して、Path.rglob
は指定したディレクトリから再帰的にパターンを検索します。
使い方はPath.glob
と同じです。
from pathlib import Path
path = Path('C:\\Test\\Python-Snippets\\Path') # ディレクトリパスを指定
for entry in path.rglob("*"):
print(entry) # entryはPathオブジェクト
# ディレクトリ内のエントリのパス一覧が表示される
存在しないパスやファイルパスを指定した場合にはエラーは発生せず、何も表示されません。
ファイルの操作
空のファイルの作成または更新日時の変更(Path.touch
)
Path.touch
は、指定したパスに空のファイルを作成します。もし、そのファイルがすでに存在している場合は、更新日時(タイムスタンプ)が更新されます。
構文は以下になります。
Path.touch(mode=0o666, exist_ok=True)
オプション引数mode
は、ファイルを新規作成する際のアクセス権限を指定します(8進数で指定)。デフォルトは0o666
(読み書き可能)です。
オプション引数exist_ok
は、ファイルがすでに存在する場合の動作を制御します。True
の場合はファイルが存在していてもエラーを発生させず、そのままタイムスタンプを更新します。False
の場合には、ファイルが存在する場合は例外(FileExistsError
)を発生させます。
from pathlib import Path
path = Path("example.txt")
path.touch() # 空のファイルの作成または更新日時の更新
パスに存在しないディレクトリが含まれる場合、および、作成権限がない場合にもエラー(それぞれFileNotFoundError
、PermissionError
)が発生します。
ディレクトリを作成する(Path.mkdir
)
Path.mkdir
は、指定したパスにディレクトリを作成します。親ディレクトリが存在しない場合や、すでに同じ名前のディレクトリが存在する場合の動作を制御できます。
構文は以下になります。
Path.mkdir(mode=0o777, parents=False, exist_ok=False)
オプション引数mode
には、新しく作成するディレクトリのパーミッション(アクセス権限)を指定します(8進数で指定)。デフォルトは0o777
です。
オプション引数parents
は、True
にした場合には、指定したディレクトリの親ディレクトリも、存在しない場合には作成します。False
(デフォルト)にした場合には、親ディレクトリが存在しない場合はエラーを発生させます。
オプション引数exist_ok
は、True
にした場合には、指定したディレクトリがすでに存在していてもエラーを発生させません。False
(デフォルト)にした場合には、すでにディレクトリが存在する場合はエラーを発生させます(v3.5以上)。
from pathlib import Path
path = Path("new_parent_dir\\new_dir") # 作成するディレクトリのパス
path.mkdir(
parents=True, # 親ディレクトリも作成
exist_ok=True, # 既に存在していてもエラーは発生させない
)
ファイルまたはディレクトリの名前の変更および移動(Path.rename
)
Path.rename
は、指定したファイルまたはディレクトリを新しい名前に変更したり、新しい場所に移動したりするために使用されます。
引数target
には、リネーム後のパスを与えます。このメソッドはtarget
を指す新しいPath
オブジェクトを返します(v3.8以降)。
ファイルの名前およびディレクトリの名前を変更する場合の例を示します。
from pathlib import Path
path = Path("example.txt")
path.touch() # ファイル example.txt の作成
path.rename("renamed_example.txt") # ファイルの名前変更
path = Path("old_directory")
path.mkdir() # ディレクトリ old_directory の作成
path.rename("new_directory") # ディレクトリの名前変更
ファイルをディレクトリに移動する場合の例を示します。
from pathlib import Path
path = Path("renamed_example.txt") # 移動するファイルのパス
path.rename(
"new_directory\\renamed_example.txt"
) # renamed_example.txtをnew_directoryに移動
Windowsではtarget
がすでに存在する場合はエラーが発生します(Linuxではユーザーにパーミッションがあれば置換されます)。
また、変更前のファイルやディレクトリが存在しない場合はエラーが発生します。
ファイルまたはディレクトリの名前の変更および移動(上書き)(Path.replace
)
Path.replace
は、ファイルまたはディレクトリを別の場所に移動したり、名前を変更する際に使用されます。Path.rename
と異なり、既存のファイルを無条件に置換します。
引数target
には、新しい名前または新しい場所を示すパスを指定します。
戻り値には、新しいPathオブジェクトを返します(v3.8以上)。
ファイルの名前およびディレクトリの名前を変更する場合の例を示します。
from pathlib import Path
path = Path("example.txt")
path.touch() # ファイル example.txt の作成
path.replace("renamed_example.txt") # ファイルの名前変更
path = Path("old_directory")
path.mkdir() # ディレクトリ old_directory の作成
path.replace("new_directory") # ディレクトリの名前変更
ファイルをディレクトリに移動する場合の例を示します。
from pathlib import Path
path = Path("renamed_example.txt") # 移動するファイルのパス
path.replace(
"new_directory\\renamed_example.txt"
) # renamed_example.txtをnew_directoryに移動
Windowsでは、既存のディレクトリを置換しようとするとPermissionError
が発生します。
また、変更前のファイルやディレクトリが存在しない場合はエラーが発生します。
ファイルの削除(Path.unlink
)
Path.unlink
は、ファイルやシンボリックリンクを削除するためのメソッドです。
オプション引数missing_ok
は、True
にすると、削除対象が存在しない場合でもエラーを発生させません。False
(デフォルト)では、削除対象が存在しない場合にエラーを発生させます。
from pathlib import Path
path = Path("example.txt")
path.unlink() # ファイルを削除
このメソッドはファイルやシンボリックリンクを削除できますが、ディレクトリの削除はできません。
空のディレクトリを削除する(Path.rmdir
)
Path.rmdir
は、空ディレクトリを削除するためのメソッドです。削除対象のディレクトリが空でない場合にはエラーが発生します。
from pathlib import Path
path = Path("directory")
path.rmdir() # ディレクトリの削除
パーミッションと所有権の取得と変更
ファイルやディレクトリのアクセス権を変更する(Path.chmod
)
Path.chmod
は、ファイルやディレクトリのアクセス権(パーミッション)を変更するために使用されます。
引数mode
に、ファイルやディレクトリに適用するパーミッションを表す整数値を8進数で設定します(0o755
など)。
from pathlib import Path
path = Path("example.txt")
path.touch() # 空のファイル作成
# パーミッションを変更 (rwxr--r--)
path.chmod(0o744)
mode
は8進数で表され、読み取り(4
)、書き込み(2
)、実行(1
)を組み合わせたものを使用します(つまり0~7
の値)。この整数0~7
を所有者、グループユーザー、その他に対して順に並べて設定します(0o777
など)。
WindowsではPOSIXのような詳細な権限管理が存在しないため、動作が制限されることがあります。
例えば、0o444
を設定すると読み取り専用になります。
まとめ
Pythonのpathlib
モジュールでパスやファイルを扱うコマンドについて概要と使用例をまとめました。ご参考になりましたら幸いです。