ベスパリブ

ベスパもってないです。バイク買いました。

pathlibのファイル操作いろいろ

pathlibとは

Python 3.4以上で推奨されているファイル・パス操作のモジュール。 os.path の代替となるモジュール。

docs.python.org

使い方をよく忘れるので備忘録です。

返り値はPathオブジェクトなので、文字列に変換したかったらstr()で囲んでやります。

カレントファイルの絶対パス

from pathlib import Path
this_file = Path(__file__).resolve()
print(str(this_file))
# C:\Users\XXXX\workspace\project\hoge.py

ディレクトリの取得

this_file.parents[0]
# C:\Users\XXXX\workspace\project

this_file.parents[1]
# C:\Users\XXXX\workspace\

パス結合

PROJECT_HOME = this_file.parents[0]
Path(PROJECT_HOME).joinpath("aaa", "bbb", "ccc", "ddd")
# C:\Users\XXXX\workspace\project\aaa\bbb\ccc\ddd

特定ディレクトリ下のファイルの検索

以下のようなフォルダ構成になっているとする

project  +--- aaa
               L aaa.txt
         + --- bbb
               L bbb.txt
         + --- ccc
               L ccc.txt
         + --- README.txt
folders = Path(PROJECT_HOME).glob("*")
for folder in folders:
    print(folder)
"""
WindowsPath('C:/Users/XXXX/workspace/project/aaa')
WindowsPath('C:/Users/XXXX/workspace/project/bbb')
WindowsPath('C:/Users/XXXX/workspace/project/ccc')
WindowsPath('C:/Users/XXXX/workspace/project/README.txt')
"""
folders = Path(PROJECT_HOME).glob("*")
for folder in folders:
    # フォルダでないならスキップ
    if not folder.is_dir():
        continue
    print(folder)
"""
WindowsPath('C:/Users/XXXX/workspace/project/aaa')
WindowsPath('C:/Users/XXXX/workspace/project/bbb')
WindowsPath('C:/Users/XXXX/workspace/project/ccc')
"""

特定ディレクトリ下のファイルの再帰的な検索

files = Path(PROJECT_HOME).rglob("*.txt")
for f in files:
    print(f)
"""
WindowsPath('C:/Users/XXXX/workspace/project/aaa/aaa.txt')
WindowsPath('C:/Users/XXXX/workspace/project/bbb/bbb.txt')
WindowsPath('C:/Users/XXXX/workspace/project/ccc/ccc.txt')
WindowsPath('C:/Users/XXXX/workspace/project/README.txt')
"""

ファイルの削除

files = Path(PROJECT_HOME).rglob("*.txt")
for f in files:
    f.unlink()

フォルダの削除

空のフォルダじゃないと削除できないので、まずはフォルダ内のファイルを再帰的に削除する必要がある。

for folder in folders:
    # フォルダでないならスキップ
    if not folder.is_dir():
        continue

    # フォルダ内のファイルを再帰的に削除する
    files = Path(folder).rglob("*")
    for f in files:
        f.unlink()
        
    # 最後に、フォルダを削除する
    folder.rmdir()