【保存版】Pythonファイル/フォルダ操作術。コピペで使えるサンプルコード付き。

当ページのリンクには広告が含まれています。

Pythonでファイルやフォルダ操作を行う代表的なライブラリとして os、shutil 、glob がありますが、それらの違いや特徴を把握せず、何となく使っている方も多いのではないでしょうか?

今回は、これらライブラリの違いと特徴、及び具体的な事例をもとにした使い方のサンプルコードを紹介したいと思います。

尚、本記事はフォルダ名やファイル名を使った操作に限定しているため、ファイルに対する読み書き方法については「【図で解説】Python でファイル読み書きの基礎と実践。すぐに使えるサンプル満載」で詳しく解説しています。

目次

os、shutil 、globの違いと特徴

os、shutil、glob はともにファイルやフォルダを操作するためのライブラリですが、それぞれ大きな違いがあります。

ライブラリ特徴
osWindowsやLinuxなどのオペレーティングシステムに対して基本的な操作を行うライブラリ
であり、その一環としてファイルシステムに対する操作が可能です。
具体的には、指定したファイル又はフォルダに対して、作成、削除、名前変更、ファイル削除
などの操作が行なえます。
shutilosのファイルシステムに関する機能を、フォルダ配下のファイルやフォルダを含めて
適用できるようにしたライブラリです。
指定したフォルダの階層を再帰的に検索し、作成、削除、移動、削除などの操作が可能です。
glob指定したパターンに一致する全てのフォルダやファイルのパスを取得します。
glob自身にファイルやフォルダの操作機能はありません。

以上の内容を表にまとめると次のようになります。

機能osshutilglob
コピー×ファイル、フォルダ×
移動×ファイル、フォルダ×
削除ファイルのみフォルダのみ×
リネームファイルのみファイル、フォルダ×
フォルダ作成××
ファイル一覧取得××可能

このように、それぞれのライブラリごとに役割や機能が異なるため使い分ける必要があります。

利用のための準備

os,shutio,glob いずれもPython標準のライブラリであるため pip により別途インストールの必要はありませんが、利用の際は import をしておく必要があります。

用途別のメソッド紹介

ここからは、やりたいこと別にライブラリとメソッドを一覧にまとめています。

ファイルやフォルダの存在確認

os.path.exists() は、フォルダ、ファイルのどちらでも存在確認が可能です。どちらが存在したかを知りたい場合は、os.path.isdir()、又はos.path.isfile() を使います。

機能記述例説明
ファイル又はフォルダの存在確認os.path.exists('path')指定したパス(フォルダ又はファイル)が
存在すれば True、無ければFalseが返る。
フォルダであるか否かの確認os.path.isdir('path')指定したパスがフォルダならTrue
フォルダでなければFalseが返る。
ファイルであるか否かの確認os.path.isfile('path')指定したパスがファイルならTrue
ファイルでなければFalseが返る。

フォルダの新規作成

os.mkdirs() に単一のフォルダを指定すると os.mkdir() の代用が出来ます。実用的にはフォルダが無ければ作成、あれば何もしないというケースが多いと思いますので、その際は os.path.exists() と組み合わせて使いましょう。

機能記述例説明
フォルダの新規作成os.mkdir('myfolder')フォルダを階層で指定する場合、その末端より上の
フォルダが存在しないとエラーとなる。
また、指定したフォルダ(階層を指定した場合、
その末端)が既に存在すればエラーとなる。
フォルダの新規作成
(階層下のフォルダも作成)
os.mkdirs('myfolder')フォルダを階層で指定すると、その階層を含めて
作成してくれる。
但し、指定したフォルダ(階層を指定した場合、
その末端)が既に存在すればエラーとなる。

フォルダ又はファイルのリネーム

ファイルおよびフォルダどちらにおいてもリネームすることが可能です。

機能記述例説明
フォルダ又はファイル
のリネーム
os.rename('oldname','newname')oldname で指定したフォルダ又はファイルの
名前を、newnameで指定した名前に変更します。
変更後の名前が既に存在する場合エラーとなる。

ファイル又はフォルダのコピー

shutil.copy() は単一のファイルコピーをするメソッドです。第2引数にフォルダを指定する場合、そのフォルダ配下にコピーされます。一方 shutil.copytree() は指定したフォルダを丸ごと別のフォルダにコピーしてくれます。

shutil.copy()はコピー先にファイルが存在していても上書きしてくれますが、shutil.copytree()の場合はエラーとなるためご注意ください。

機能記述例説明
ファイルコピーshutil.copy('path1','path2')path1は必ずファイルであること。
path2はファイル又はフォルダのどちらでも良い。
path2にフォルダを指定する場合、事前に作成
しておく必用がある。
フォルダコピーshutil.copytree('path1','path2')path1で指定したフォルダを階層ごと、path2で
指定したフォルダ配下にコピーする。
コピー先存が既に存在している場合はエラー
となる。

ファイル又はフォルダの移動

shutil.move() はファイルとフォルダの両方に対して移動することが可能です。

注意点として既に移動先が存在する場合、ファイル移動では移動先のファイルが置き換わります(元ファイルを削除後に移動される)が、フォルダ移動で既にフォルダが存在する場合、その直下に移動します。

shutil.move() をリネームの代用として使うことは可能ですが、移動先が存在する場合は警告もなく処理されてしまうため少々危険かもしれません。

機能記述例説明
ファイルの移動
フォルダの移動
shutil.move('path1','path2')path1で指定したファイル又はフォルダを path2で指定した場所に移動する。
path1がフォルダの場合、path2の配下に丸ごと移動する。
path1とpath2に同じ階層を指定することで、フォルダやファイルのリネームとして代用することが可能。

ファイル又はフォルダの削除

ファイル削除は os.remove()、フォルダ削除は shutil.rmtree() で使い分けが必要です。また、どちらも指定したファイル又はフォルダが存在しない場合はエラーになります。

こちらも有れば削除、なければ何もしないというケースが多いと思いますので、その場合は os.path.exists() との組み合わせが必要です。

機能記述例説明
ファイルの削除os.remove('path')pathで指定したファイルを削除する。
pathは必ずファイルを指定すること。
ファイルが存在しなければエラーとなる。
フォルダの削除shutil.rmtree('path')path で指定したフォルダを階層ごと削除する。
path は必ずフォルダを指定すること。
フォルダが存在しないとエラーとなる。

ファイルまたはフォルダ一覧の取得

os.listdir() は指定したフォルダの直下にあるファイルやフォルダを取得したい場合にのみ使えます。

一方、glob.glob()の場合、recursive引数を省略するとフォルダ直下のファイルやフォルダだけが対象となりますが、recursive=Trueを指定することで、その配下にある全てのフォルダやファイルをリストアップしてくれます。

機能記述例説明
ファイル一覧の取得
(直下のみ)
os.listdir('path')指定したフォルダ直下のファイル及びフォルダをリストで返す。
フォルダの階層を再帰的に検索してくれない。ワイルドカードも不可。
ファイル一覧の取得
(階層下全て)
os.walk('path')指定したフォルダの階層を再帰的に検索し、結果を_walk オブジェクトで返す。
for 文等のループを使って結果を取り出す。
ファイル一覧の取得
(直下、及び階層下全て)
glob.glob('path',recursive=True)pathで指定したフォルダの階層を再帰的に検索し、結果をリストで返す。
pathが存在しない場合は空のリスト[] が返される。
pathにはワイルドカード(*や?) が指定可能。
例:glog.glob('e:/document/*.csv')

glob.glob() のワイルドカードの指定が少し複雑なので、整理しておきます。

ファイルパスの操作(フォルダ名やファイル名の分割、結合)

指定したパスからファイル名、フォルダ名などを取り出すには次のメソッドを使います。

機能記述例説明
パスをファイル名と拡張子に分けて取得os.path.splitext('path')pathを拡張子とそれ以外に分割し、タプルで返す。
'e:/document/test.csv' ⇒ ('e:/document/text' , '.csv')
尚、拡張子にはピリオドが含まれる。
ファイル名のみ取得os.path.basename('path')'e:/document/test.csv' ⇒ 'test.csv'
フォルダ名の取得os.path.dirname('path')'e:/document/test.csv' ⇒ 'e:/document'
フォルダ名と
ファイル名を結合
os.path.join('folder1','folder2',','filename')'e:/data','sub','file.txt' ⇒ 'e:/data/sub/file.txt
相対バスの取得os.path.relpath('targetpath','basetpath')targetpathで指定されたパスを、basepathを基準とした相対パスに変換する。
'd:/aaa/file.txt' , 'd:/bbb/test.txt' ⇒
'../../aaa/file.txt'
ファイルサイズ
の取得
os.path.getsize('path')ファイルサイズをバイト数で返す。
作成時刻の取得os.path.getctime('path')いずれも1970年1月1日午前0時0分0秒からの経過秒を返すため、datetime.datetime.formtimestamp()
を使って年月日時分秒に変換する必要あり。
更新時刻の取得os.path.getmtime('path')
最終アクセス時刻
の取得
os.path.getatime('path')

>>> import os
>>>import datetime
>>>access_time = os.path.getatime("P:/hoge.txt")
>>># タイムスタンプから日時に変換
>>>access_time_str = datetime.datetime.fromtimestamp(access_time)
>>>print("アクセス日時:", access_time_str)
>>>
>>>アクセス日時: 2024-02-03 15:11:50.395828

ファイル、フォルダ操作の実用事例

ワイルドカードに一致するファイルを対象にフォルダを丸ごとコピー

copy_files_with_filter関数は、source_folderで指定されたフォルダ階層を丸ごとdestination_folder で指定されたフォルダ直下にコピーする関数です。

copy_files_with_filter(source_folder, destination_folder ,wildcard_pattern,filter_func=None)

特徴としては、第3引数にワイルドカードが指定でき、かつ コールバック関数 filter_func によりフィルター条件が掛けられる点です。

次のソースコードはコールバック関数のサンプルです。コピー対象となるファイルのファイルスタンプが、引数で指定した日時より大きい場合は True 、以下の場合は False を返します。これをcopy_files_with_filterの第4引数に指定することで、指定日時より以降に作成されたファイルのみコピーすることができます。

関数の使い方は次の通りです。

ちなみに、is_newer_thanの戻り値としてコールバック関数のfilter_funcを返していますが、コピー対象の日時も関数の中で処理したかったからです。
もし関数外でspecified_date を定義するのであれば、次の様に書けます。

2つのフォルダを比較して、それぞれの差分を抽出する

folder_diff関数は、source_folderで指定されたフォルダと、target_folderで指定フォルダに対して、階層下にある全てのファイルを比較し、それぞれの差分をタプルで返します。

unique_source_files,unique_target_files = folder_diff(source_folder, target_folder ,wildcard_pattern)

戻り値は、元のフォルダにのみ存在するファイル(unique_source_files)のリストと、比較先のフォルダにのみ存在するファイル(unique_target_files)のリストです。

使い方は次の通りです。

まとめ

今回は、Pythonでファイルやフォルダを扱うためのライブラリである os、shutil、glob について、それぞれの特徴と役割を明確にし、用途別(ファイル一覧の取得、コピー、移動、削除など)にメソッドを紹介しました。

また、実用事例として、ワイルドカードに対応したフォルダ丸ごとコピー関数や、2つのフォルダの差分ファイル抽出関数について、サンプルコードと使い方を解説しました。

趣味でプログラミングをする際に、パソコン上のファイルを扱うことも多いでしょう。そんな時に、今回の記事を参考にしていただければ幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次