PythonのShutilモジュールの使い方|ファイルのコピーや再帰コピー、削除のやり方を解説

スポンサーリンク

こんにちは!この記事では、Pythonのshutilモジュールに存在する関数について学びます。

では、はじめましょう。

Pythonのshutilモジュールは、ファイルに対するいくつかの高レベルの操作を提供してくれます。


ファイルやディレクトリをコピーしたり削除したりすることができます

さっそくこのモジュールを使って、それぞれのファイルの実用的な実装を詳しく学びましょう。

スポンサーリンク

shutil モジュールでファイルをコピーする方法は?

あるファイルの内容を別のファイルにコピーするために、shutilモジュールには様々な方法が用意されています。

1. shutil.copyfileobj(src,dst)

ファイルdata.txtの内容をdata1.txtにコピーしたい場合、次のようなコードを使用することができます

import shutil
 
f=open('data.txt','r')
f1=open('data1.txt','w')
 
# Syntax: shutil.copyfileobj(src,dst)
shutil.copyfileobj(f,f1)
 
f.close()
f1.close()

2. shutil.copy(src,dst)

あるファイルのデータを別のファイルにコピーするもう一つの方法は、ファイル・オブジェクトを作成せずに行うことができます。

ここでは、ファイルの相対パスを渡します。

import shutil
#shutil.copy(src.dst)
shutil.copy('data.txt','data1.txt')

3. shutil.copy2(src,dst)

copy(src,dst) と copy2(src,dst) 関数はほとんど同じですが、 copy2(src,dst) はソースファイルのメタデータもコピーします。

メタデータとは、そのファイルがいつ作成され、いつアクセスされ、いつ変更されたかという情報です。

import shutil
#shutil.copy2(src,dst)
shutil.copy2('data.txt','data1.txt')

4. shutil.copyfile(src,dst)

ここで、コピー元とコピー先は相対パスでも絶対パスでもかまいません。

例えば、あるファイルをあるフォルダにコピーしたい場合、次のようなコードになります。

import shutil
import os
 
path='D:DSCrackerDS CrackerPython'
print("Before copying file:")
print(os.listdir(path))
 
shutil.copyfile('data.txt','Python/data3.txt')
 
print("After copying file:")
print(os.listdir(path))

結果は以下の通りです。

Before copying file:
['hey.py']
After copying file:
['data3.txt', 'hey.py']

5. shutil.move(src,dst)

あるファイルをある場所から削除し、別の場所に移動したいとします。

ここでは、shutil.pyをsourceから別の場所に移動してみましょう。

import shutil
import os
 
path='D:DSCrackerDS Cracker'
print("Source folder:")
print(os.listdir(path))
 
path1='D:DSCrackerDS CrackerPython'
shutil.move('shutil.py','Python')
 
print("After moving file shutil.py to destination folder, destination contains:")
print(os.listdir(path1))

結果は以下の通りです。

Source folder:
['cs', 'data.txt', 'Python', 'ReverseArray', 'ReverseArray.cpp', 'shutil.py']
After moving file shutill.py to destination folder, destination contains:
['data1.txt', 'data3.txt', 'hey.py', 'nsawk.py', 'shutil.py']

6. shutil.copytree(src,dst)

すべてのファイルを含む完全なフォルダを新しい場所にコピーしたい場合、copytree(src,dst)関数を使用することができます

この関数は、srcをルートとするディレクトリツリー全体をdstというディレクトリに再帰的にコピーし、コピー先のディレクトリを返します。

PythonというフォルダーをNewfolderというフォルダーにコピーしてみましょう。

注意:この関数では、すでに存在するフォルダーに内容をコピーすることはできないので、コピー先のフォルダー内に新しいフォルダーを作成しなければなりません。

ここでは、Newfolderフォルダーの中にpython1というフォルダーを作成しました。

import os
import shutil
 
path='D:DSCrackerDS CrackerPython'
print("Source folder:")
print(os.listdir(path))
 
shutil.copytree('Python','NewPython/python1')
 
path1='D:DSCrackerDS CrackerNewPythonpython1'
print("Destination folder:")
print(os.listdir(path1))

結果は以下の通りです。

Source folder:
['data1.txt', 'data3.txt', 'hey.py', 'nsawk.py', 'shutill.py']
Destination folder:
['data1.txt', 'data3.txt', 'hey.py', 'nsawk.py', 'shutill.py']

shutil モジュールを使ってファイルを削除するには?

さて、ファイルの移動とコピーについて学んだので、Pythonスクリプトの中から特定の場所からファイルを削除する方法を学びましょう。

shutil.rmtree()を使うと、任意のフォルダ、ファイル、ディレクトリを削除することができます

Pythonのフォルダを削除してみましょう。

import os
import shutil
 
path='D:DSCrackerDS Cracker'
print("Before deleting:")
print(os.listdir(path))
 
shutil.rmtree('Python')
print("After deleting:")
print(os.listdir(path))

結果は以下の通りです。

Before deleting:
['cs', 'data.txt', 'NewPython', 'program.py', 'Python', 'ReverseArray', 'ReverseArray.cpp']
 
After deleting:
['cs', 'data.txt', 'NewPython', 'program.py', 'ReverseArray', 'ReverseArray.cpp']

How to copy permission bits of one file to another?

ファイルをコピーするのは一部です。

もし、あるファイルの同じパーミッションを他のすべてのファイルにコピーしたい場合はどうしたらよいでしょうか。

ここでは、shutil モジュールを使ってそれを行う方法を学びましょう。

1. shutil.copymode(src,dst)

このメソッドは、srcからdstにパーミッションビットをコピーします。

PythonディレクトリのパーミッションビットをPython1ディレクトリにコピーしてみましょう。

import shutil
import os
src= 'D:DSCrackerDS CrackerPython'
dest='D:DSCrackerDS CrackerPython1'
 
print("Before using shutil.copymode(), Permission bits of destination:")
print(oct(os.stat(dest).st_mode)[-3:])
 
shutil.copymode(src, dest)
print("After using shutil.copymode(), Permission bit of destination:")
print(oct(os.stat(dest).st_mode)[-3:])

結果は以下の通りです。

Before using shutil.copymode(), Permission bits of source:
677
After using shutil.copymode(), Permission bit of destination:
777

2. shutil.copystat(src,dst)

shutil.copystat(src.dst) はメタデータと一緒に許可ビットをコピーします。

import shutil
import os
import time
 
src= 'D:DSCrackerDS CrackerPython'
dest='D:DSCrackerDS CrackerPython1'
 
print("Before using shutil.copystat():")
print("Permission bits:",oct(os.stat(src).st_mode)[-3:])
print("Last modification time:", time.ctime(os.stat(src).st_mtime))
 
print("Modification time:",time.ctime(os.stat(src).st_mtime))
 
shutil.copystat(src, dest)
 
print("After using shutil.copystat():")
print("Permission bits:",oct(os.stat(dest).st_mode)[-3:])
print("Last modification time:", time.ctime(os.stat(dest).st_mtime))
print("Modification time:",time.ctime(os.stat(dest).st_mtime))

出力。

Before using shutil.copystat():
Permission bits: 777
Last modification time: Mon Dec  7 02:20:37 2020
Modification time: Mon Dec  7 02:20:37 2020
 
After using shutil.copystat():
Permission bits: 777
Last modification time: Mon Dec  7 03:43:47 2020
Modification time: Mon Dec  7 03:43:47 2020

shutilモジュールの他の関数

それでは、shutilモジュールの雑多な機能について見ていきましょう。

1. shutil.disk_usage(path)

shutil.disk_usage(path) 関数は、与えられたパス名に関するディスク使用量の統計を、メモリの総量である total、使用領域である used、空き領域である free の属性を持つタプルとして、バイト単位で返します。

import shutil
import os
 
path = 'D:DSCrackerDS CrackerNewPythonpython1'
 
statistics=shutil.disk_usage(path)
 
print(statistics)

を結果を出力すると、以下の様になります。

usage(total=1000203087872, used=9557639168, free=990645448704)

2. shutil.which()

shutil.which()関数は、与えられたコマンドcmdが呼ばれた場合に実行される実行可能なアプリケーションへのパスを返します。

import shutil
import os
 
cmd='Python'
 
locate = shutil.which(cmd)
 
print(locate)

結果は、以下の通りです。

C:UsersAskPythonAppDataLocalMicrosoftWindowsAppsPython.EXE

まとめ

この記事では、python の shutil モジュールを使って、ファイルやフォルダのコピー、削除、その他の操作を行う方法について説明しました。

楽しんでいただけたでしょうか?ご期待ください。

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