Skip to content

shutil#

ディレクトリとファイルの操作#

  • shutil.move(src, dst) ファイルやディレクトリを指定したパスへ移動し、移動先のパスを文字列で返す

  • shutil.copy(src, dst) 指定したファイル(パーミッションも)をコピーし、コピー先のパス文字列を返す

  • shutil.copytree(src, dst) 指定したパスをディレクトリごとコピーし、コピー先の文字列で返す。

Info

すでにdst で指定したパスが存在している場合は FileExistsError となります。 ディレクトリ名を日付にするなど、可変にすればエラーは避けられます。

日付を取得しコピー先のディレクトリ名に
import shutil
from datetime import datetime

now = datetime.now().strftime('%Y%m%d_%H%M%S')
src = "./src_dir/"
dst = "./dst_dir/" + now + "/"

shutil.copytree(src,dst)
  • shutil.rmtree(パス) 指定したパスの配下を含めてすべて削除

  • shutil.copyfile(src, dst) src からdst にファイルをコピーする

  • shutil.copy2(src, dst) srcからdstにファイルとパーミッション、その他のメタデータ(作成時間、変更時間、その他の情報)をコピーする。dstがディレクトリなら、その下にsrcの名前でコピーする(内部でcopy関数を使用)

  • shutil.copytree(src, dst)

Warning

copyfile関数はファイルの内容をコピーするだけであるのに対して、copy関数やcopy2関数はそのファイルが持つメタデータを(一部ではあっても)コピー先のファイルに維持しようとする。ただし、すべてをコピーできるわけではないので注意

  • shutil.chown(path, user=None, group=None) 指定された path のオーナー user と/または group を変更します。 user はシステムのユーザー名か uid です。 group も同じです。少なくともどちらかの引数を指定する必要があります。

  • shutil.make_archive('圧縮ファイル名', format='zip', root_dir='対象ディレクトリ') 「対象ディレクトリ(パスで指定)」を「圧縮ファイル名.zip」に圧縮する。「圧縮ファイル名」に.zip 拡張子は不要

  • shutil.unpack_archive('圧縮ファイル名.zip', '解凍フォルダ名') ZIPファイルの中身をすべて解凍(展開)する。解凍フォルダが存在しなくとも新規作成し、そこにZIPファイルの中身が展開される。

アーカイブ化操作#

.ssh ディレクトリにあるすべてのファイルを含む、 gzip された tar ファイルアーカイブを作成

from shutil import make_archive
import os

archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
root_dir = os.path.expanduser(os.path.join('~', '.ssh'))
make_archive(archive_name, 'gztar', root_dir)

from shutil import make_archive
import os

archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
make_archive(
    archive_name,
    'tar',
    root_dir='tmp/root',
    base_dir='structure/content',
)