Pythonのより高度なファイル、フォルダ操作ができるshutilモジュール その2:フォルダのコピー shutil.copytree

スポンサーリンク

前回のおさらい

過去4回に渡って、osモジュールとshutilモジュールを比較するため、ファイル・フォルダ操作に関して解説をしています。

前回はshutilモジュールのうち、ファイルをコピーする方法 shutil.copyfileを解説しました。

Pythonのより高度なファイル、フォルダ操作ができるshutilモジュール その1:ファイルのコピー shutil.copyfile
前回のおさらい過去3回に渡って、osモジュールとshutilモジュールを比較するため、ファイル・フォルダ操作に関して解説をしています。今回はとうとうshutilモジュールに関して解説を進めていきたいと思います。...

今回はフォルダ操作として、フォルダをコピーする方法を解説していきます。

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

今回はこのままファイルやフォルダを使っていきましょう。

またPythonプログラムは新しくものをos_module_testに作成してください。

その際、shutilモジュールをインポートすることを忘れずに。

import shutil

それでは始めていきましょう。

スポンサーリンク

フォルダをコピーする方法:shutil.copytree(“コピー元”, “コピー先”)

前回、ファイルをコピーする方法としてshutil.copfile(“コピー元”,”コピー先”)というのを紹介しました。

前回試した通り、このshutil.copyfileでは残念ながらフォルダをコピーすることはできません。

そこでフォルダをコピーする方法として、shutil.copytree(“コピー元”,”コピー先”)というコマンドが存在します。

ということでfolder1をfolder3としてコピーしてみましょう。

shutil.copytree("folder1", "folder3")

コピーすることができました。

ここで一つ疑問です。

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

Pythonでファイル操作 〜新規作成、追記、読み取り〜
前回のおさらい前回からosモジュールとshutilモジュールを比較するため、ファイル・フォルダ操作に関して解説をしています。前回はファイル・フォルダの名前を取得したり、フォルダを新規作成する方法を解説しました。...

この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モジュールを使って、ファイルやフォルダを移動、名前を変更する方法を解説していきましょう。

Pythonのより高度なファイル、フォルダ操作ができるshutilモジュール その3:ファイル・フォルダの移動・名前の変更 shutil.move
前回のおさらい過去5回に渡って、osモジュールとshutilモジュールを比較するため、ファイル・フォルダ操作に関して解説をしています。前回はshutilモジュールのうち、フォルダをコピーする方法 shutil.copytr...

ということで今回はこんな感じで。

コメント

タイトルとURLをコピーしました