acokikoy's notes

最近気になる=[NoCode, Shopify], I am..=[Python, ウクレレ, マニュアル車, CMS] LoveなWebディレクター

Python ファイル操作の覚え書き (os, pathlib, shutilライブラリ)

Python ファイル操作の覚え書き (os, pathlib, shutilライブラリ)

ファイル名に指定の接頭辞をつけてコピー shutil.copy()

# ./SampleData配下の全ファイルを検索し、同じ階層に接頭語をつけた名前でコピーする
# shutil.copy() ファイルコピー

from pathlib import Path
import shutil

pth = Path('./SampleData')
prefix = input('input prefix: ')

for f in pth.glob('**/*'):
    if not f.is_dir():             # ディレクトリは除外
        dst_f = f.parent / Path(prefix+f.name)
        shutil.copy(f, dst_f)      # ファイルコピー
        print(f"{f} --> {dst_f}")  # 進行確認用

""" 実行結果
# input prefix:  _

# SampleData/20181010_field.jpg --> SampleData/_20181010_field.jpg
# SampleData/.DS_Store --> SampleData/_.DS_Store
# SampleData/plan715401.docx --> SampleData/_plan715401.docx
# SampleData/test20181010.csv --> SampleData/_test20181010.csv
# SampleData/test20181120.txt --> SampleData/_test20181120.txt
# SampleData/plan501201.xlsx --> SampleData/_plan501201.xlsx
# SampleData/sub_dir/plan715401.docx --> SampleData/sub_dir/_plan715401.docx
# SampleData/sub_dir/plan501201.xlsx --> SampleData/sub_dir/_plan501201.xlsx
"""

ディレクトリーごとまるっとコピー、ただし除外ファイルあり shutil.copytree()

# ディレクトリツリーごとまるっとコピーする(ただし.DS_Storeとワードファイルは除外)
# shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False)

from pathlib import Path
import shutil

src = Path('./SampleData')          # shutil.copytree のパラメータで使うだけなら src = './SampleData' でも機能する
dst = Path('./SampleData_copied')   # shutil.copytree のパラメータで使うだけなら dst = './SampleData' でも機能する

path = shutil.copytree(src, dst, ignore=shutil.ignore_patterns('*.docx', '.DS_Store'), dirs_exist_ok=True)

ディレクトリーごとまるっと移動 shutil.move()

# ディレクトリツリーごとまるっと移動する
# shutil.move(src, dst, copy_function=copy2)

from pathlib import Path
import shutil
import sys

src = Path('./SampleData')
dst = Path('./SampleData_moved')


if not src.exists():
    print(f"{src.name}が存在しません")
    sys.exit()

if dst.exists():
    print(f"既に{dst.name}が存在します")
    sys.exit()

    
shutil.move(src, dst)

""" 実行結果
# 正常系
# PosixPath('SampleData_moved')    shutil.move()の返値

# 異常系1 - srcディレクトリなし
# SampleDataが存在しません
# An exception has occurred, use %tb to see the full traceback.
# SystemExit

# 異常系2 - dstディレクトリ重複
# 既にSampleData_movedが存在します
# An exception has occurred, use %tb to see the full traceback.
# SystemExit
"""