ファイル・フォルダ操作 ライブラリ 文法・環境 標準ライブラリ・モジュール

【python】ファイル、フォルダのコピー【shutilモジュール、os/pathlibとの組合せ】

pythonでファイル、フォルダをコピーする方法について紹介します。

ファイルのコピーで使用される定番モジュールとして、shutilモジュールがあります。
shutilモジュールには、ファイルのコピー可能な関数が3種類用意されており、それぞれの関数の違いなどについても紹介します。

この記事で分かること

■shutilモジュールを用いてファイルをコピー

  • copyfile関数を用いてファイルをコピー
  • copy関数を用いてファイルをコピー
  • copy2関数を用いてファイルをコピー
  • ファイルコピーで上書きしない方法

■shutilモジュールを用いてフォルダをコピー

  • copytree関数を用いてフォルダをコピー

■shutilモジュールと他モジュールの組合せ

  • shutilモジュールとpathlibモジュールを組合せて、ファイルをコピー

上記の内容について、サンプルコードを交えながら紹介しています。
なお、サンプルコードは、下記のようなフォルダ構成で作成しています。

フォルダ構成
サンプルコードのフォルダ構成

スポンサーリンク

shutilモジュールを用いてファイルをコピー

shutilモジュールは、ファイルのコピーで使用される定番モジュールです。

pythonの標準モジュールであるため、インストールせずに使用することができます。( import は必要です )

shutilモジュールには、ファイルのコピー用の関数が3種類用意されており、それぞれの特徴は以下のとおりになります。

ファイルコピー用の関数の種類

shutil.copyfile
⇒ファイルのパーミッションも、メタデータもコピーしない。

shutil.copy
⇒ファイルのパーミッションはコピーするが、メタデータはコピーしない。

shutil.copy2
⇒ファイルのパーミッションもメタデータもコピーする。

※パーミッション:ファイルごとに定義された読み取り・書き込みなどのアクセスに関する情報
※メタデータ:ファイルの付帯情報。作成者や、作成日、更新日など。

以降では、それぞれの関数について、サンプルコードを交えながら使用方法を紹介します。

copyfile : パーミッション、メタデータはコピーしない

はじめに、copyfile関数について紹介します。

copyfile関数は、ファイルのみをコピーし、パーミッションデータやメタデータはコピーしません

以下、copyfile関数で、ファイルをコピーするサンプルコードです。
コピー先パスは、フルパスで指定しています。

### copyfile関数でフルパス指定でファイルをコピー
import shutil

src = r'C:\"---任意のパス---"\folder\file1.txt'
dst = r'C:\"---任意のパス---"\folder\file1_copy.txt'

shutil.copyfile(src, dst)

なお、すでに同名のファイルがある場合は上書きされます。

copyfile関数は、フォルダ指定でのコピーはできません。

コピー先をフォルダ指定した場合は、" PermissionError " となります。

### copyfile関数でフォルダパス指定でファイルをコピー
import shutil

src = r'C:\"---任意のパス---"\folder\file1.txt'
dst = r'C:\"---任意のパス---"\folder\folder2'

shutil.copyfile(src, dst)

# PermissionError

スポンサーリンク

copy : パーミッションはコピー。メタデータはコピーしない

つぎに、copy関数について紹介します。

copy関数は、パーミッションデータはコピーしますが、メタデータはコピーしません

以下、copy関数で、ファイルをコピーするサンプルコードです。
コピー先パスは、フルパスで指定しています。

### copy関数でフルパス指定でファイルをコピー
import shutil

src = r'C:\"---任意のパス---"\folder\file1.txt'
dst = r'C:\"---任意のパス---"\folder\file1_copy.txt'

shutil.copy(src, dst)

copyfile関数と同様、すでに同名のファイルがある場合は上書きされます。

copy関数は、フォルダ指定でも、ファイルのコピーが可能です。

### copy関数でフォルダパス指定でファイルをコピー
import shutil

src = r'C:\"---任意のパス---"\folder\file1.txt'
dst = r'C:\"---任意のパス---"\folder\folder2'

shutil.copy(src, dst)

copy2 : パーミッション、メタデータもコピー

つぎに、copy2関数について紹介します。

copy2関数は、パーミッションデータ、メタデータともにコピーします
メタデータがコピーされるので、更新日などもコピー先のファイルと同じになります。

以下、copy2関数で、ファイルをコピーするサンプルコードです。
コピー先パスは、フルパスで指定しています。

### copy2関数でフルパス指定でファイルをコピー
import shutil

src = r'C:\"---任意のパス---"\folder\file1.txt'
dst = r'C:\"---任意のパス---"\folder\file1_copy.txt'

shutil.copy2(src, dst)

copyfile関数、copy関数と同様、すでに同名のファイルがある場合は上書きされます。

copy2関数は、フォルダ指定でも、ファイルのコピーが可能です。

### copy2関数でフォルダパス指定でファイルをコピー
import shutil

src = r'C:\"---任意のパス---"\folder\file1.txt'
dst = r'C:\"---任意のパス---"\folder\folder2'

shutil.copy2(src, dst)

ファイルコピーで上書きしない方法【osモジュールとの組合せ】

copyfile関数、copy関数、copy2関数とも、同名のファイルがあった場合、上書きでコピーしてしまいます。

上書きを避けたい場合は、osモジュールを使ってファイルの存在確認を行い、同名のファイルが存在しないことを確認することで、上書きを回避できます

### osモジュールでファイルの存在確認をして上書きを回避
import shutil
import os

src = r'C:\"---任意のパス---"\folder\file1.txt'
dst = r'C:\"---任意のパス---"\folder\file1_copy.txt'

if not os.path.exists(dst) :
    shutil.copy2(src, dst)
else :
    print('同じ名前のファイルがあるため、コピーしませんでした')

> if not os.path.exists( dst ) :

ファイルパス " dst " が存在しない場合に、ifの処理を実行します。

ファイル、フォルダの存在確認については、下記の記事で紹介しています。

ファイル、フォルダの存在確認方法

スポンサーリンク

shutilモジュールを用いてフォルダをコピー

次に、フォルダをコピーする方法を紹介します。

copytree : フォルダを再帰的にコピー

shutilモジュールのcopytree関数を用いることで、フォルダを再帰的にコピーできます

以下、copytree関数で、フォルダをコピーするサンプルコードです。

なお、すでに同名のフォルダが存在する場合は、" FileExistsError "のエラーとなります。

### copytree関数でフォルダをコピー
import shutil

src = r'C:\"---任意のパス---"\folder\folder1'
dst = r'C:\"---任意のパス---"\folder\folder1_copy'

shutil.copytree(src, dst)

shutilモジュールとpathlibモジュールを組合せて、ファイルをコピー

pathlibモジュールは、python3.4から追加されたパス操作を便利にするモジュールです。

パスをオブジェクトとして扱えるため、連続的な操作がしやすいという特徴があります。

なお、pathlibモジュールには、ファイルをコピーする関数はないので、ファイルのコピーはshutilモジュールで行います。

以下は、pathlibモジュールのパスオブジェクトでファイルの存在を確認し、同名のファイルが存在しない場合にファイルをコピーするサンプルコードです。

### pathlibモジュールでファイルの存在確認をして、上書きを回避
import shutil
import pathlib

src = pathlib.Path(r'C:\"---任意のパス---"\folder\file1.txt')
dst = pathlib.Path(r'C:\"---任意のパス---"\folder\file1_copy.txt')

print(type(dst))
# <class 'pathlib.WindowsPath'>
print(dst.exists())
# False

if not dst.exists() :
    shutil.copy2(src, dst)
else :
    print('同じ名前のファイルがあるため、コピーしませんでした')

> print(type(dst))
> # <class 'pathlib.WindowsPath'>

dstが、pathlibクラスになっていることが分かります。

> if not dst.exists( ) :

パスモジュールのexistsメソッドを用いて、ファイルの存在確認をしています。

スポンサーリンク

まとめ

pythonでファイル、フォルダをコピーする方法について紹介しました。

ファイル名の取得方法などのファイル操作も知っておくと便利ですので、併せて参考にしてみてください。

ファイル、フォルダの名前、パスの一覧の取得方法

スポンサーリンク

-ファイル・フォルダ操作, ライブラリ, 文法・環境, 標準ライブラリ・モジュール
-, ,