Python3でのディレクトリの操作と管理

はじめに

各種モジュールを用いて,ディレクトリやファイルの操作及び管理を行います.
今回も先頭にリファレンスを付けています.

リファレンス

osモジュール関連

os.getcwd() カレントディレクトリ名の取得
os.chdir() カレントディレクトリの変更
os.makedirs() ディレクトリの生成
os.path.abspath(path) pathへの絶対パスを取得
os.path.relpath(start, path) startを起点とするpathへの相対パスを取得
os.path.exists(path) pathが存在するかどうかを取得
os.getcwd().split(os.sep) カレントディレクトリへの絶対パスをリスト形式で区切って取得
os.path.getsize(filename) filenameのファイルサイズを取得
os.path.join(p1, p2, ...) パスp1, p2, ...をOSに合わせて結合
os.unlink(path) pathに指定したファイルを削除
os.rmdir(path) pathに指定したディレクトリを削除
os.access(path, mode) pathに設定されている各種権限(modeで指定)を取得
mode 読み込み権限はos.R_OK,書き込み権限はos.W_OK,実行権限はos.X_OK

shutilモジュール関連

shutil.copy(src, dst) srcに指定したファイルをdstへコピー
shutil.copytree(src, dst) srcに指定したディレクトリ内の全ファイルをdstへコピー
shutil.move(src, dst) srcに指定したファイルをdstへ移動(ファイル名変更にも利用可)
shutil.rmtree(path) pathに指定したディレクトリを完全削除

使用例

ファイルの一覧表示(疑似lsコマンド)

import os, sys

def main():
    # ディレクトリ名を取得
    path = input("Abspath of directory : ")

    # ディレクトリが存在しなければ終了
    if not os.path.exists(path):
        print(path, "doesn't exist.")
        sys.exit()

    # ファイル1つずつについて繰り返し
    for i, filename in enumerate(os.listdir(path), start=1):
        # 当該ファイルまでのパスを結合
        fullpath = os.path.join(path, filename)

        # ファイルの場合はサイズと権限を調査
        if os.path.isfile(fullpath):
            filesize = str(os.path.getsize(fullpath))
            r = "r" if os.access(fullpath, os.R_OK) else "-"
            w = "w" if os.access(fullpath, os.W_OK) else "-"
            x = "x" if os.access(fullpath, os.X_OK) else "-"
            print("[{}] {}{}{} {} {} {}".format(i, r, w, x, filename.ljust(20, "."), filesize.rjust(5), "Bytes"))
        else:
            print("[{}] {}/".format(i, filename))

if __name__ == '__main__':
    main()
Abspath of directory : C://test
[1] rwx hoge.txt............  9570 Bytes
[2] rwx huga.txt............     2 Bytes
[3] subdir/