前回のおさらい
過去4回に渡って、osモジュールとshutilモジュールを比較するため、ファイル・フォルダ操作に関して解説をしています。
前回はshutilモジュールのうち、ファイルをコピーする方法 shutil.copyfileを解説しました。

今回はフォルダ操作として、フォルダをコピーする方法を解説していきます。
前回、ファイルをコピーしたことから、フォルダ構造はこんな感じになっていると思います。

今回はこのままファイルやフォルダを使っていきましょう。
またPythonプログラムは新しくものをos_module_testに作成してください。
その際、shutilモジュールをインポートすることを忘れずに。
import shutil
それでは始めていきましょう。
フォルダをコピーする方法:shutil.copytree(“コピー元”, “コピー先”)
前回、ファイルをコピーする方法としてshutil.copfile(“コピー元”,”コピー先”)というのを紹介しました。
前回試した通り、このshutil.copyfileでは残念ながらフォルダをコピーすることはできません。
そこでフォルダをコピーする方法として、shutil.copytree(“コピー元”,”コピー先”)というコマンドが存在します。
ということでfolder1をfolder3としてコピーしてみましょう。
shutil.copytree("folder1", "folder3")

コピーすることができました。
ここで一つ疑問です。
前にos.rmdirでフォルダを削除しようとした際、空のフォルダなら削除できたのですが、中に何かファイルなどが存在する場合は削除できませんでした。

このshutil.copytreeも同じ様な制限はあるのでしょうか。
中身があるフォルダをコピーしてみる
ということで中身が入っているfolder2をfolder4としてコピーしてみましょう。
shutil.copytree("folder2", "folder4")

実行した結果、folder4が作られ、その中にfolder2と同じ様にdocument1.txtとdocument2.txtがあります。
ということでshutil.copytreeでは中にファイルがあろうがなかろうがコピーすることができるということです。
違うフォルダにコピーしてみる
前回、ファイルをコピーする際、コピー元やコピー先にはパスを含んだ形でも指定可能だとお話ししました。
ということでフォルダでも同じこととが可能なのか試してみましょう。
今回は先ほどfolder2からコピーしたfolder4を、さらにfolder3の中にfolder4としてコピーしてみます。
shutil.copytree("folder4", "./folder3/folder4")

folder3の中にfolder4が作成され、その中にdocument1.txtとdocument2.txtが存在する形になりました。
ということでコピー元、コピー先にパスを含んだ形でもコピーすることができます。
すでに存在するフォルダ名をコピー先に指定してみる
ではちょっと指定を間違えたとして、コピー先をすでにあるフォルダ名にしてしまった場合どうなるでしょうか。
現在、フォルダはfolder1、folder2、folder3、folder4があります。
そこでfolder1をfolder4としてコピーしてみます。
shutil.copytree("folder1", "folder4")
実行結果
---------------------------------------------------------------------------
FileExistsError Traceback (most recent call last)
<ipython-input-8-cc5938e3cc6e> in <module>
----> 1 shutil.copytree("folder1", "folder4")
/opt/anaconda3/lib/python3.7/shutil.py in copytree(src, dst, symlinks, ignore, copy_function, ignore_dangling_symlinks)
322 ignored_names = set()
323
--> 324 os.makedirs(dst)
325 errors = []
326 for name in names:
/opt/anaconda3/lib/python3.7/os.py in makedirs(name, mode, exist_ok)
219 return
220 try:
--> 221 mkdir(name, mode)
222 except OSError:
223 # Cannot rely on checking for EEXIST, since the operating system
FileExistsError: [Errno 17] File exists: 'folder4'
ちょっと長いエラーが出てきてびっくりしましたが、要するにもうfolder4があるからコピーできないということです。
今回はshutil.copytreeに関して解説してみました。
次回はshutilモジュールを使って、ファイルやフォルダを移動、名前を変更する方法を解説していきましょう。

ということで今回はこんな感じで。
コメント