TECHNOLOGY

Pythonによるパスとファイルを操作するコマンド一覧(pathlibモジュール)

本記事では、Pythonのpathlibモジュールでパスとファイルを操作する主要なコマンドの一覧と使用例について紹介します。

目次

はじめに

動作確認は、以下の環境で行っております。

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は、指定したパスがシンボリックリンクであるかどうかを判定します。パスがシンボリックリンクである場合に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.unlinkPath.rmdirメソッドに変更すると、ファイルやディレクトリを削除できます。

dirpath / namedirpathnameは、それぞれ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()  # 空のファイルの作成または更新日時の更新

パスに存在しないディレクトリが含まれる場合、および、作成権限がない場合にもエラー(それぞれFileNotFoundErrorPermissionError)が発生します。

ディレクトリを作成する(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は、ファイルやシンボリックリンクを削除するためのメソッドです。

オプション引数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モジュールでパスやファイルを扱うコマンドについて概要と使用例をまとめました。ご参考になりましたら幸いです。

-TECHNOLOGY
-