【Python入門】Pythonでファイルコピーする方法について徹底解説

Python

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