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

スポンサーリンク

前回のおさらい

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

Pythonでファイル・フォルダ操作 〜osモジュールでの名前の変更・移動 os.rename、削除 os.remove、os.rmdir〜
前回のおさらい前々回よりosモジュールとshutilモジュールを比較するため、ファイル・フォルダ操作に関して解説をしています。前回はファイルの作成方法、書き込み・読み込み方法に関して解説しました。今回はファ...

今回はとうとうshutilモジュールに関して解説を進めていきたいと思います。

まずはこれまでのおさらい。

これまでosモジュールを使って、フォルダの作成、フォルダ・ファイルの名前変更、移動、削除を行ってきました。

表にしてみるとこんな感じです。

osモジュール
フォルダの作成os.mkdir(“フォルダ名”)
フォルダ名の変更os.rename(“変更前”, “変更後”)
ファイル名の変更os.rename(“変更前”,”変更後”)
フォルダの移動os.rename(“変更前”,”変更後”)
ファイルの移動os.rename(“変更前”,”変更後”)
フォルダの削除os.rmdir(“フォルダ名”)
ファイルの削除os.rmove(“ファイル名”)

今回もファイル・フォルダ操作を行いますので、とりあえず最初にこんな感じでファイル・フォルダ構造を整えておきます。

document1.txtには1から5の数字を書いておいてください。

document2.txtは特に何も書いていない空のファイルでOKです。

この状態でos_module_test内で新しいPythonプログラムを作成します。

そして今回はshutilモジュールをインポートしてください。

import shutil

これで準備は完了です。

スポンサーリンク

ファイルのコピー:shutil.copyfile(“コピー元”,”コピー先”)

ファイル・フォルダのコピーは実はosモジュールではなかった機能です。

(私が知らないだけかもしれませんが…)

まずはフォルダのコピーを紹介します。

フォルダのコピーはshutil.copyfile(“コピー元”,”コピー先”)でできます。

document1.txtをdocument3.txtとしてコピーしてみましょう。

shutil.copyfile("document1.txt", "document3.txt")

document1.txtには1から5の数字が書かれているので、コピー先であるdocument3.txtにも1から5の数字が書かれているはずです。

確認してみましょう。

確かに1から5の数字が書かれていて、コピーされたファイルだと分かりました。

ちなみに同じフォルダに同じファイル名でコピーしようとするとどうなるでしょうか。

shutil.copyfile("document1.txt", "document1.txt")

実行結果
---------------------------------------------------------------------------
SameFileError                             Traceback (most recent call last)
<ipython-input-7-c2cfe34d6f53> in <module>
----> 1 shutil.copyfile("document1.txt", "document1.txt")

/opt/anaconda3/lib/python3.7/shutil.py in copyfile(src, dst, follow_symlinks)
    102     """
    103     if _samefile(src, dst):
--> 104         raise SameFileError("{!r} and {!r} are the same file".format(src, dst))
    105 
    106     for fn in [src, dst]:

SameFileError: 'document1.txt' and 'document1.txt' are the same file

同じファイルだということでコピーできないとエラーが出ました。

スポンサーリンク

すでにあるファイル名をコピー先に指定してみる

ではすでにあるファイル名でコピーしようとするとどうなるでしょうか。

document3.txtを開いて中身を消した後、document1.txtをdocument3.txtとしてコピーしてみましょう。

shutil.copyfile("document1.txt", "document3.txt")

数字を消したはずなのに、1から5の数字が書かれています。

これはdocument1.txtがdocument3.txtに上書きされたということを示しています。

ということですでにあるファイル名をコピー先に指定すると上書きされます。

スポンサーリンク

違うフォルダ間でコピー

コピー元、コピー先にはパスを含んだ形でもコピーできます。

document1.txtをfolder2の中にdocument1.txtとしてコピーしてみましょう。

shutil.copyfile("document1.txt", "./folder2/document1.txt")

前に解説した通り、folder2の前にある”./”は現在のファイルを示しています。

document1.txtがfolder2内にdocument1.txtとしてコピーされました。

スポンサーリンク

フォルダをコピーしてみる

ファイルがコピーできるということで、フォルダはコピーできないのでしょうか。

folder1をfolder3としてコピーをしようとしてみます。

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

実行結果
---------------------------------------------------------------------------
IsADirectoryError                         Traceback (most recent call last)
<ipython-input-9-bc8615ecadd5> in <module>
----> 1 shutil.copyfile("folder1", "folder3")

/opt/anaconda3/lib/python3.7/shutil.py in copyfile(src, dst, follow_symlinks)
    118         os.symlink(os.readlink(src), dst)
    119     else:
--> 120         with open(src, 'rb') as fsrc:
    121             with open(dst, 'wb') as fdst:
    122                 copyfileobj(fsrc, fdst)

IsADirectoryError: [Errno 21] Is a directory: 'folder1'

folder1はフォルダ(directory:ディレクトリ)だということでエラーが出てきました。

実はフォルダをコピーするには違うコマンドが存在するのです。

ということで次回、フォルダをコピーする方法を解説していきます。

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

ではでは今回はこんな感じで。

コメント

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