Photoruction工事中!

Photoructionの開発ブログです!

Pathlibでディレクトリ・ファイルを操作する

はじめに

こんにちは、株式会社フォトラクションでPMをしている峠です。

業務でディレクトリやファイル操作でパスを扱うことが多く、これらを Pathlib と呼ばれるPythonのライブラリを用いて操作しています。

今回はPathlibでできる操作をいくつか紹介したいと思います。

Pythonではパス操作時にos などのライブラリを使うことが一般的なイメージがありますが、弊社ではPathlibを使用しています。(参考:pathlibドキュメント

1. 基本パス操作

from pathlib import Path

# Pathインスタンスを作成
path = Path()

"""カレントパスを取得"""
current_path = path.cwd()
print(current_path) => "/content"

"""パスの連結"""
# ①「/」で連結
dir1_path = current_path / 'dir1'
file1_path = dir1_path / 'file1.txt'
print(dir1_path) => "/content/dir1"
print(file1_path) => "/content/dir1/file1.txt"
# ②「joinpath()」で連結
dir2_path = current_path.joinpath('dir2')
file2_path = dir2_path.joinpath('file2.txt')
print(dir2_path) => "/content/dir2"
print(file2_path) => "/content/dir2/file2.txt"

"""ディレクトリの判定"""
dir1_is_dir = dir1_path.is_dir()
file1_is_dir = file1_path.is_dir()
print(dir1_is_dir) => "True"
print(file1_is_dir) => "False"

"""ファイルの判定"""
dir1_is_file = dir1_path.is_file()
file1_is_file = file1_path.is_file()
print(dir1_is_file) => "False"
print(file1_is_file) => "True"

"""ディレクトリの作成"""
# parents=True:中間ディレクトリも含めて作成する
# exist_ok=True:既存のディレクトリが指定されていてもエラーを出力しない
dir1_path.mkdir(exist_ok=True,parents=True)

"""ファイルの作成"""
# exist_ok=True:既存のディレクトリが指定されていてもエラーを出力しない
file1_path.touch(exist_ok=True)

"""パスの存在を確認"""
dir1_exist = dir1_path.exists()
file1_exist = file1_path.exists()
print(dir1_exist) => "True"
print(file1_exist) => "True"
dir2_exist = dir2_path.exists()
file2_exist = file2_path.exists()
print(dir2_exist) => "False"
print(file2_exist) => "False"

2. ディレクトリ・ファイルの操作

"""ディレクトリ・ファイルの名前を取得"""
dir1_name = dir1_path.name
file1_name = file1_path.name
print(dir1_name) => "dir1"
print(file1_name) => "file1.txt"

"""ディレクトリ・ファイルの拡張子を除いた名前を取得"""
dir1_stem = dir1_path.stem
file1_stem = file1_path.stem
print(dir1_stem) => "dir1"
print(file1_stem) => "file1"

"""ディレクトリ・ファイルの拡張子を取得(なければ取得しない)"""
dir1_suffix = dir1_path.suffix
file1_suffix = file1_path.suffix
print(dir1_suffix) => ""
print(file1_suffix) => ".txt"

"""パスを文字列としてを取得"""
dir1_str = str(dir1_path)
file1_str = str(file1_path)
print(dir1_str) => "/content/dir1"
print(file1_str) => "/content/dir1/file1.txt"

3. ディレクトリ・ファイル一覧の取得

# dir1に追加でディレクトリ・ファイルを作成
dir1_path.joinpath('file2.txt').touch(exist_ok=True)
dir1_path.joinpath('dir1-1').mkdir(exist_ok=True)
dir1_path.joinpath('dir1-2').mkdir(exist_ok=True)

"""ディレクトリ・ファイルの一覧をリストで取得"""
path_list = [path for path in dir1_path.iterdir()]
print(path_list) => "[PosixPath('/content/dir1/file2.txt'),"
                                            "PosixPath('/content/dir1/dir1-2'), "
                                            "PosixPath('/content/dir1/file1.txt')," 
                                            "PosixPath('/content/dir1/dir1-1')]"

"""ディレクトリの一覧をリストで取得"""
dir_list = [path for path in dir1_path.iterdir() if path.is_dir()]
print(dir_list) => "[PosixPath('/content/dir1/dir1-2'),"
                                        "PosixPath('/content/dir1/dir1-1')]"

"""ファイルの一覧をリストで取得"""
file_list = [path for path in dir1_path.iterdir() if path.is_file()]
print(file_list) => "[PosixPath('/content/dir1/file2.txt'),"
                                        " PosixPath('/content/dir1/file1.txt')]"

最後に

Pathlibはファイル操作機能が豊富で使い方も感覚的なのでとても便利です。

よかったら使ってみてください。

参考

pathlib - Object-oriented filesystem paths

株式会社フォトラクションでは一緒に働く仲間を募集しています