概要
Python の新しいファイルパス操作モジュール pathlib
の使い方について解説します。
pathlib
は Python 3.6 で導入されたファイルパス操作モジュールです。これまでの os.path
モジュールに比べて、簡潔にコードが書けるので、Python 3.6 以上であれば、こちらを使用することをおすすめします。
os.path と pathlib
機能的にはどちらも同じことができますが、os.path
はファイルパスを表す文字列を扱うのに対し、pathlib
はファイルパスをオブジェクト化して扱うという違いがあります。実際の例を見てみましょう。
下記のようなディレクトリ構造があり、A/a.png
があるディレクトリを基点に、B/b.png
を相対的に指定するコードを考えます。
├── A
│ └── a.png
└── B
└── b.png
os.path
と比較して、pathlib
は簡潔なコードになっていることがわかります。
ファイルの結合
pathlib の一番の特徴はファイルの結合をディレクトリの区切り文字と同じフォワードスラッシュ /
で行えることでしょう。
ファイル名や親ディレクトリの取得
パスからファイル名や親ディレクトリなどを取得する方法について紹介します。
Windows | Linux | ||
---|---|---|---|
概要 | パス | C:\data\hoge\sample.tar.gz | /data/hoge/sample.tar.gz |
パスの構成要素 | Path.parts | (‘C:\’, ‘data’, ‘hoge’, ‘sample.tar.gz’) | (‘/’, ‘data’, ‘hoge’, ‘sample.tar.gz’) |
ドライブレター | Path.drive | C: | |
ルート | Path.root | \ | / |
ドライブレター付きのルート | Path.anchor | C:\ | |
親ディレクトリの一覧 | Path.parents | [‘C:/data/hoge’, ‘C:/data’, ‘C:/’] | [‘/data/hoge’, ‘/data’, ‘/’] |
1つ上の階層 | Path.parents[0] | C:\data\hoge | /data/hoge |
2つ上の階層 | Path.parents[1] | C:\data | /data |
1つ上の階層 | Path.parent | C:\data\hoge | /data/hoge |
ファイル名 | Path.name | sample.tar.gz | sample.tar.gz |
拡張子を除いたファイル名 | Path.stem | sample.tar | sample.tar |
拡張子 | Path.suffix | .gz | .gz |
拡張子の一覧 | Path.suffixes | [‘.tar’, ‘.gz’] | [‘.tar’, ‘.gz’] |
ファイル URI で表したパス | Path.as_uri() | file:///C:/data/hoge/sample.tar.gz | file:///data/hoge/sample.tar.gz |
\ を / に置き換えたパス | Path.as_posix() | :/data/hoge/sample.tar.gz |
Windows
Unix
ファイルの存在確認
概要 | パス | 備考 |
---|---|---|
ファイルが存在するかどうか | Path.exists() | |
ディレクトリかどうか | Path.is_dir() | |
ファイルかどうか | Path.is_file() | |
マウントポイントかどうか | Path.is_mount() | Unix のみ |
シンボリックリンクかどうか | Path.is_symlink() | |
Unix ソケットかどうか | Path.is_socket() | Unix のみ |
ファイルが空かどうか | Path.stat().st_size == 0 | |
絶対パスかどうか | Path.is_absolute() | |
パスが other を基点とした相対パスかどうかを判定する | PurePath.is_relative_to(*other) | |
2つのパスが同じ場所を指すかどうか | Path.samefile(other_path) |
ファイルサイズ、所有ユーザー、所有グループを取得する
以下の関数でファイルサイズ、所有ユーザー、所有グループを取得できます。
パスの書き換え置き換える
以下の関数でパスからファイル名のファイル名、拡張子を除いたファイル名、拡張子だけを置き換えられます。
カレントディレクトリ、ホームディレクトリを取得する
概要 | ||
---|---|---|
カレントディレクトリ | Path.cwd() | |
ホームディレクトリ | Path.home() | |
ホームディレクトリを表す ~ を展開する | Path.expanduser() |
権限の変更、ファイル/ディレクトリの作成、削除
mkdir()
でディレクトリを作成します。
- 権限は
mode
で指定します。ox666
のように8進数で指定するとよいでしょう。 parents=True
を指定すると、親ディレクトリが存在しない場合はそれも作成します。- ディレクトリがすでに存在する場合はデフォルトではエラーになりますが、
exist_ok=True
を指定すると、ディレクトリが存在しない場合のみ作成します。
rmdir()
で空のディレクトリを削除できます。
中身があるディレクトリでファイルごと削除する場合は shutil.rmtree()
を使用します。
権限の変更は chmod()
でできます。
touch()
で空のファイルを作成します。
- 権限は
mode
で指定します。ox666
のように8進数で指定するとよいでしょう。 - ファイルがすでに存在する場合はデフォルトではエラーになりますが、
exist_ok=True
を指定すると、ファイルが存在しない場合のみ作成します。
unlink()
でファイルを削除します。
- ファイルが存在しない場合はデフォルトではエラーになりますが、missing_ok=True を指定すると、ファイルが存在する場合のみ削除します。
write_bytes()
でバイナリデータ、write_text()
でテキストデータをファイルを開いて書き込めます。
symlink_to(target)
で target
へのシンボリックリンクを作成します。
Windows の場合、リンク先がディレクトリの場合 symlink_to(target, target_is_directory=True)
とする必要があります。
ファイルを読み込む
Path.read_bytes()
で指定したファイルをバイナリモード、Path.read_text()
でテキストモードで読み込み、返します。
Path.open()
で組み込み関数 open()
と同様のファイルオープン処理が行えます。
ファイルを移動する、リネームする
Path.rename() でリネーム処理が行えます。
ファイル一覧を取得する
Path.iterdir()
でディレクトリ内のファイル一覧を取得できます。
Path.glob()
で glob.glob()
と同様、ワイルドカードを使ったより高度な検索が行えます。glob()
で検索する場合、入れ子になったディレクトリも再帰的に検索する場合はその部分を **
にします。
コメント