Pythonではファイル・ディレクトリを操作するさまざまな方法が用意されています。
ファイルやディレクトリを削除するにはどうすればいいの?
ファイルやディレクトリの名称や更新日付などを確認するにはどうすればいいの?
ファイルの一覧を取得するにはどうすればいいの?
複数のファイルを検索するにはどうすればいいの?
今回はPythonの基本的なファイルやディレクトリの操作について、やさしく解説していきたいと思います。
ファイルやディレクトリなどを扱うテクニックをいくつか覚えていると、プログラミングの幅も広がりますよ!
この記事では
- 【基礎】Pythonでファイルやディレクトリを扱う基本
- 【実践】osモジュールの使い方について
- 【実践】globモジュールの使い方について
などについて、わかりやすく解説していきたいと思います。
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
ファイルやディレクトリを扱うには
まずはPythonでファイルやディレクトリを扱う基本について抑えておきましょう。
疑問に思っている方もいるかもしれませんが、ディレクトリとはフォルダと同じ意味として捉えても問題はありません。Pythonでは基本的なファイルやディレクトリの操作はosモジュールで、正規表現のような記述を使ったパス名の指定をglobモジュールで行います。
globモジュールの操作はosモジュールと組み合わせると便利なので、まずはosモジュールについてを解説していきます。
osモジュールの使い方
osモジュールとは、その名の通りOS(オペレーションシステム)に関する操作をするための機能が組み込まれている標準モジュールです。
osモジュールを使うと、ファイルやディレクトリの操作を行う事が出来ます。まずは、osモジュールを使用するにはモジュールそのものをインポートする必要があります。
このようにosモジュールをインポートしてみましょう。
import os
これで、「os.(関数名)」でosモジュールの機能にアクセスすることが出来るようになります。これ以降のコードはインポートしたものとして、import osの一行は省略します。
またこれらの操作についてよくわからない方は、こちらの記事もご覧ください。
ディレクトリを作成する
では実際にosモジュールの機能を使ってみましょう。まずは、ディレクトリを作成してみましょう。
こちらのサンプルコードを見てください。
os.mkdir('./test')
このサンプルコードでは、mkdir関数を使って新しいディレクトリを作成しました。「.」は今現在いるディレクトリのことを表しています。
また、osモジュールのgetcwd関数で、現在のディレクトリの場所を確認することが出来ます。
current_dir = os.getcwd() print(current_dir)
実行結果
'C:UsersFolderProjects'
この場合、先程のtestディレクトリはProjectsディレクトリ内に作成されることとなります。
ファイルやディレクトリを削除する
removeでファイルを削除
ディレクトリの中にあるファイルを削除するにはremove関数を使います。
現在のディレクトリには「myfile.txt」があると仮定して、こちらのサンプルコードを見てみましょう。
os.remove("./myfile.txt") res = os.path.exists("./myfile.txt") print(res)
実行結果
False
このサンプルコードでは、myfileという.txtファイルを削除しました。
remove関数は、引数に削除したいファイルのパスを指定します。ちゃんと削除されているかどうかは、exists関数の戻り値で確認することが出来ます。
exists関数は引数に指定されたパスが存在すればTrueを、存在しなければFalseを返します。
rmdirでディレクトリを削除
ディレクトリを削除したい場合はrmdir関数を使います。
os.rmdir("./test1") res = os.path.exists("./test1") print(res)
実行結果
False
rmdir関数はremove関数と同じように、引数に削除したいディレクトリのパスを与えます。
実際、exists関数の戻り値はFalseと表示されました。ファイルとディレクトリでは、削除をするために使う関数が違うことに気をつけましょう!
また、ディレクトリになにも入っていない場合はremdir関数でファイルを削除できますが、1つでもファイルが存在していた場合エラーが発生し、削除できません。
たとえば、test1というディレクトリにmyfile.txtが存在していた場合以下のエラーが発生します。
OSError: [Errno 66] Directory not empty: 'test1'
これは、test1が空ではないですよというエラーです。
shutil.rmtreeでディレクトリをファイルごと削除
ディレクトリをファイルごとすべて削除するには、rmdirではなく、shutilモジュールのrmtree関数を使います。
import shutil shutil.rmtree("test1") res = os.path.exists("./test1") print(res)
実行結果
False
shutilモジュールのrmtree関数で中身のあるディレクトリを削除できました。
rmtree関数はファイルのあるなしに関わらずディレクトリを削除します。
ファイルやディレクトリの名前を取得する
次にファイルやディレクトリの名前を取得する方法を解説します。
こちらのサンプルコードを見てみましょう。
filename = os.path.basename("./test1/myfile.txt") dirname = os.path.dirname("./test1/myfile.txt") print(filename) print(dirname)
実行結果
'myfile.txt' './test1'
こちらのサンプルコードでは、ファイル名とディレクトリ名を順に表示させてみました。
ファイル名にはos.path.basenameを、ディレクトリ名にはos.path.dirnameを使いました。
どちらの関数も、引数にはパスを指定します。
ファイルが作成された日付を確認する
- ファイルが作成された日付
- 最後にファイルが修正された日付
- 最後にファイルが使用された日付
- 最後にファイルのメタデータに変更があった日付
- ファイルサイズ
などのファイルのメタデータもosモジュールと、timeモジュールを組み合わせること取得できます。
こちらのサンプルコードを見てみましょう。
import os import time print("ファイル名: " + __file__) print("最終更新日: " + time.ctime(os.path.getatime(__file__))) print("最終修正日: " + time.ctime(os.path.getmtime(__file__))) print("最終メタデータ変更日" + time.ctime(os.path.getctime(__file__))) print("ファイルサイズ: " + str(os.path.getsize(__file__)))
実行結果
ファイル名: test.py 最終更新日: Tue Dec 26 19:02:00 2017 最終修正日: Tue Dec 26 19:01:58 2017 最終メタデータ変更日Tue Dec 26 19:01:58 2017 ファイルサイズ: 343
__file__はPython組み込みの変数で、現在のファイルのパスを意味しています。
また、timeのctime関数はUnix時間を、コンピューターのローカルの時間に整形してくれる便利な関数です。Unix時間とは1970年の1月1日から何秒経過したかによって、時間を表現しているものです。
たとえば、os.path.getatime関数などはUnix時間を返すので、time.ctime関数で再度、変換しました。
ファイルかディレクトリか確かめる
あるパスがファイルか、ディレクトリなのかを確かめるためにはisfileとisdir関数を使います。これらのisで始まる関数はTrueかFalseを返します。
こちらのサンプルコードを見てみましょう。
print(os.path.isfile(__file__)) print(os.path.isdir(__file__))
実行結果
True False
__file__は現在のファイルを返すのでTrueを返し、isdir関数の場合、ファイルはディレクトリではないのでFalseを返しています。
ディレクトリ下のファイル一覧を取得
たとえば、testというディレクトリに、test1.py、test2.py、test3.pyというファイルがある仮定します。testのディレクトリにあるファイル一覧を出力したい場合は、os.listdir関数を使います。
こちらのサンプルコードを見てみましょう。
path = "./test" print(os.listdir(path))
実行結果
['test1.py', 'test2.py', 'test3.py']
このように、lisdir関数はlistとして、ディレクトリ下にあるファイル名を取得します。ちゃんと、test1.py、test2.py、test3.pyが取得できていますね。
ファイルの拡張子を取得する
ファイルがどんな種類のものかを知りたいときには、その拡張子を確認しましょう。
拡張子は、splitext関数を使って取得できます。
こちらのサンプルコードを見てみましょう。
sep_path = os.path.splitext(__file__) print(sep_path[1])
実行結果
.py
pythonのコードを実行したファイルの拡張子はもちろん.pyですよね。splitext関数は、リストとして、パスの拡張子より左側と拡張子を返します。
なので、拡張子自体を使用したい場合はsep_path[1]のように、1番目の要素を指定します。
globモジュールの使い方
ここからはglobモジュールについて解説します。
globモジュールは、ファイルやディレクトリを操作するときにとても便利な、
- ワイルドカードパターンマッチング
- 正規表現
を使うことが出来ます。これらについて詳しく見ていきましょう。
ワイルドカードを使ってファイルを検索する
ワイルドカードとは、検索などを行うときに使う特殊文字の一つです。
主にアスタリスク(*)が用いられます。アスタリスク(*)は0文字以上の任意の文字列を指定します。
testというディレクトリの中に、様々な名前のテキストファイル(.txtファイル)があると仮定して、こちらのサンプルコードを見てみましょう。
import glob path_list = glob.glob('test/*.txt') print(path_list)
実行結果
['testfile1.txt', 'testfile2.txt', 'testfile3.txt']
サンプルコードではまず、globモジュールをインポートしています。
そしてglob関数を使って「test」ディレクトリ内の全ての「.txtファイル」のパス名を表示させました。
「*.txt」という構文は、ディレクトリにある「.txtファイル」すべてという意味になります。
正規表現を使ってファイルを検索する
次はもう少し高度なファイルの検索をしてみましょう。
これには正規表現というテクニックを使います。この正規表現こそが、globモジュールを使う上での大きな特徴となります。
正規表現については、これらの記事を見てみると理解がより深まりますよ!
こちらのサンプルコードを見てみましょう。
import glob path_list = glob.glob('./[0-9].*') print(path_list)
glob関数の引数に渡した文字列が、正規表現になります。
実行結果
['./1.txt', './2.png', './3.mp3']
正規表現の意味はわかったでしょうか。正規表現はいろいろな文字列を一つの形式で表す表現方法になります。この正規表現では、「(数字ファイル名).すべての拡張子」のファイルを現在のディレクトリから探しています。
他にもこのような使い方をすることが出来ます。
import glob path_list = glob.glob(**/*.txt', recursive=True) print(path_list)
実行結果
['2.txt', 'sub/3.txt']
この場合は、どのような名前でも良いファイルを、再帰的に探してリストを返しています。
正規表現はとても奥が深いものですが、使いこなすととても自由に文字列を検索することが出来るようになります。
まとめ
今回は、Pythonの基本的なファイルやディレクトリの操作を解説しました。
この記事で書いたことをまとめると、
- ファイルやディレクトリの基本的操作はosモジュール
- globモジュールはワイルドカードや正規表現が使えるので、ファイル検索などに便利
になります。
皆さんも、この記事を通してファイルやディレクトリに関する知識をどんどん深めていってくださいね。
なお、今Pythonを学習している方は以下の記事もどうぞ。
はじめてPythonを使う方でもわかりやすいように、Pythonでできることやその学習法などを中心にまとめています。
復習にも使えると思いますので、ぜひ一度ご覧になってみてくださいね。
【Python 入門完全攻略ガイド】