torinaブログ

DjangoとBootstrap4で作成したブログ
Python, Django, Kivy, Bootstrap, Apache等のメモです
ソースコード

Python、shutilでファイル、ディレクトリ操作

Python Python標準ライブラリ
2016年6月14日23:05


shutil モジュールはファイルやファイルの集まりに対する高水準の操作方法を多数提供します。
特にファイルのコピーや削除のための関数が用意されています。
個別のファイルに対する操作については、 os モジュールも参照してください。



高水準の操作ということで、単純なopen()等を使った操作よりも簡単に行うことができます。
以下は、a.pyというファイルをa2.pyというファイル名でコピーして作成します。
既にa2.pyが存在していた場合は、上書きします。
import shutil

# (コピー元, コピー先)
shutil.copyfile("a.py", "a2.py")


もちろん、絶対パスでも指定できます。
import os
import shutil

current_dir = os.path.dirname(os.path.abspath(__file__))

read_path = os.path.join(current_dir, "a.py")
write_path = os.path.join(current_dir, "a2.py")

shutil.copyfile(read_path, write_path)


コピー先がディレクトリの場合は、copyfileではなくcopyを使います。
この場合、folerAの中にa.pyがコピーされます。
import shutil

shutil.copy("a.py", "folderA")


copyfileobjという、ファイルではなくファイル形式のオブジェクトを扱う関数もあります。
これは、Helloと書かれたfile.pyが出来上がります。
import shutil
from io import StringIO

fsrc = StringIO("Hello")
with open("file.py", "w") as fdst:
    shutil.copyfileobj(fsrc, fdst)


ByteIOバージョンはこうです。
import shutil
from io import BytesIO

fsrc = BytesIO(b"Hello")
with open("file.py", "wb") as fdst:
    shutil.copyfileobj(fsrc, fdst)


copyfileobjをrequestsと一緒に使い、ダウンロード等もできます。
import shutil
import requests

url = "ttps://torina.top/media/images/98265c87e5d0395a96056d3e7f711a6d_m.jpg"
res = requests.get(url, stream=True)
with open("test.jpg", "wb") as fdst:
    shutil.copyfileobj(res.raw, fdst)


copytreeを使うと、ディレクトリを丸ごとコピーできます。
import shutil

shutil.copytree("folderA", "folderC")


rmtreeを使うと、ディレクトリ丸ごと削除です。
import shutil

shutil.rmtree("folderC")


moveは、ファイル又はディレクトリを別の場所に移動します。
移動先がディレクトリとして存在していれば、元srcがファイルでもディレクトリでも、移動先のディレクトリの中に入れてくれます。
移動先がファイルとして存在していた場合、元srcがディレクトリの指定ならばエラー。元srcがファイルならば上書きします。

import shutil

shutil.move("a.py", "b.py")
shutil.move("folderA", "folderB")


zipなどのアーカイブ化操作も可能です。
これは、カレントディレクトリのZIPが作成されます。current.zipです。
import shutil

shutil.make_archive("current", "zip")


http://docs.python.jp/3/library/shutil.html