Pythonには様々なファイル操作を行うためのライブラリがあります。その中でも、ファイルのコピーを行うためには「shutil」というライブラリが利用されます。この記事では、Pythonのshutilライブラリを用いたファイルコピする方法について紹介します。
# copy2関数を用いたファイルコピーの方法
# (ファイルの内容、パーミションの状態、ファイルの主なメタデータ)
shutil.copy2(SRC_FILEPATH, DST_FILEPATH)
# copy関数を用いたファイルコピーの方法(ファイルの内容、パーミションの状態)
shutil.copy(SRC_FILEPATH, DST_FILEPATH)
# copyfile関数を用いたファイルコピーの方法(ファイルの内容のみ)
shutil.copyfile(SRC_FILEPATH, DST_FILEPATH)
下記の様な内容で悩んでいる/困っている場合に使える方法を参考までにご共有させて頂きます。
・Pythonでは、どの様にファイルをコピーするの?
・Pythonのshutilライブラリは、どの様に使うのだろうか?
ファイルコピーの方法
copy2関数を用いたファイルコピーの方法(ファイルの内容、パーミションの状態、ファイルの主なメタデータ)
shutilライブラリを使ったエクスプローラー上で行う一般的なファイルコピーは非常に簡単に行うことができます。以下は、shutilライブラリのcopy2関数を使ったファイルコピーの例です。(ファイルの内容、パーミションの状態、ファイルの主なメタデータをコピーする方法になります。)
import shutil
shutil.copy2(コピー元ファイルのパス, コピー先ファイルのパス)
copy関数を用いたファイルコピーの方法(ファイルの内容、パーミションの状態)
また、ファイルの内容およびパーミションの状態に関してコピーする場合には、以下の例の様にshutilライブラリのcopy関数を使用します。(ファイルの内容、パーミションの状態をコピーする方法になります。)
import shutil
shutil.copy(コピー元ファイルのパス, コピー先ファイルのパス)
copyfile関数を用いたファイルコピーの方法(ファイルの内容のみ)
そして、ファイルの内容のみコピーする場合には、以下の例の様にshutilライブラリのcopyfile関数を使用します。(ファイルの内容のみコピーする方法になります。)
import shutil
shutil.copyfile(コピー元ファイルのパス, コピー先ファイルのパス)
ファイルコピーの方法による違い
copy2関数を用いたファイルコピーの方法(ファイルの内容、パーミションの状態、ファイルの主なメタデータ)
import shutil
import os
src_file = "SAMPLE/src.txt"
dst_file = "SAMPLE/dst_copy2.txt"
shutil.copy2(src_file, dst_file)
print(check_permission(src_file))
print(check_permission(dst_file))
print(check_metadata(src_file))
print(check_metadata(dst_file))
[permission] R:True / W:False / X:True / F:True / 33060
[permission] R:True / W:False / X:True / F:True / 33060
[metadata] File Size:11 / Modified Date:1678524739.3861513 / Create Date:1678524546.5379405
[metadata] File Size:11 / Modified Date:1678524739.3861513 / Create Date:1678534395.9100988
上記の様に、パーミションの状態、ファイルの主なメタデータがコピー元とコピー先のファイルがほぼ同じであることが分かります。Create Dateに関しては、エクスプローラーのコピーと同様、コピー作業を行った日時が作成日時として書き込まれます。(独自関数であるcheck_permission関数とcheck_metadata関数に関しては、下記に追記しております。)
copy関数を用いたファイルコピーの方法(ファイルの内容、パーミションの状態)
import shutil
import os
src_file = "SAMPLE/src.txt"
dst_file = "SAMPLE/dst_copy.txt"
shutil.copy(src_file, dst_file)
print(check_permission(src_file))
print(check_permission(dst_file))
print(check_metadata(src_file))
print(check_metadata(dst_file))
[permission] R:True / W:False / X:True / F:True / 33060
[permission] R:True / W:False / X:True / F:True / 33060
[metadata] File Size:11 / Modified Date:1678524739.3861513 / Create Date:1678524546.5379405
[metadata] File Size:11 / Modified Date:1678534396.125033 / Create Date:1678534396.125033
上記の様に、パーミションの状態に関してはコピー元とコピー先のファイルがほぼ同じであることが分かります。ただ、copy2関数を用いてファイルコピーした場合と違い、更新日時がコピー作業を行った日時、つまり作成日時と同じであることが分かります。(独自関数であるcheck_permission関数とcheck_metadata関数に関しては、下記に追記しております。)
copyfile関数を用いたファイルコピーの方法(ファイルの内容のみ)
import shutil
import os
src_file = "SAMPLE/src.txt"
dst_file = "SAMPLE/dst_copyfile.txt"
shutil.copyfile(src_file, dst_file)
print(check_permission(src_file))
print(check_permission(dst_file))
print(check_metadata(src_file))
print(check_metadata(dst_file))
[permission] R:True / W:False / X:True / F:True / 33060
[permission] R:True / W:True / X:True / F:True / 33206
[metadata] File Size:11 / Modified Date:1678524739.3861513 / Create Date:1678524546.5379405
[metadata] File Size:11 / Modified Date:1678534396.2321432 / Create Date:1678534396.2311456
上記の様に、copyfile関数を用いてファイルコピーをした場合、パーミションの状態もリセットされることが分かります。(独自関数であるcheck_permission関数とcheck_metadata関数に関しては、下記に追記しております。)
ファイルの「パーミションの状態」および「主要なメタデータ」を確認する関数
def check_permission(file_path):
permission_status = os.stat(file_path).st_mode
check_R = os.access(file_path, os.R_OK) # Check for read access
check_W = os.access(file_path, os.W_OK) # Check for write access
check_X = os.access(file_path, os.X_OK) # Check for execution access
check_F = os.access(file_path, os.F_OK) # Check for existence of file
return f"[permission] R:{check_R} / W:{check_W} / X:{check_X} / F:{check_F} / {permission_status}"
def check_metadata(file_path):
file_size = os.path.getsize(file_path)
modify_date = os.path.getmtime(file_path)
create_date = os.path.getctime(file_path)
return f"[metadata] File Size:{file_size} / Modified Date:{modify_date} / Create Date:{create_date}"
まとめ
Pythonのshutilライブラリを使えば、手作業だと場合によっては時間のかかるファイルコピーが容易に行うことができます。ぜひ、それぞれの用途に合わせて、上記の例を参考にファイルコピーの機能を活用していただければと思います。
関連検索ワード
How to copy a file with Python?
関連キーワード
python, 入門, 使い方, 初心者, コピー, copy