【Python入門】ファイル/フォルダを操作する方法|os・glob

Pythonではファイル・ディレクトリを操作するさまざまな方法が用意されています。

ディレクトリを作成するにはどうすればいいの?
ファイルやディレクトリを削除するにはどうすればいいの?
ファイルやディレクトリの名称や更新日付などを確認するにはどうすればいいの?
ファイルの一覧を取得するにはどうすればいいの?
複数のファイルを検索するにはどうすればいいの?

今回はPythonの基本的なファイルやディレクトリの操作について、やさしく解説していきたいと思います。

ファイルやディレクトリなどを扱うテクニックをいくつか覚えていると、プログラミングの幅も広がりますよ!

この記事では

  • 【基礎】Pythonでファイルやディレクトリを扱う基本
  • 【実践】osモジュールの使い方について
  • 【実践】globモジュールの使い方について
などについて、わかりやすく解説していきたいと思います。

なお、Pythonの記事については、こちらにまとめています。

ファイルやディレクトリを扱うには

まずはPythonでファイルやディレクトリを扱う基本について抑えておきましょう。

疑問に思っている方もいるかもしれませんが、ディレクトリとはフォルダと同じ意味として捉えても問題はありません。Pythonでは基本的なファイルやディレクトリの操作はosモジュールで、正規表現のような記述を使ったパス名の指定をglobモジュールで行います。

globモジュールの操作はosモジュールと組み合わせると便利なので、まずはosモジュールについてを解説していきます。

osモジュールの使い方

osモジュールとは、その名の通りOS(オペレーションシステム)に関する操作をするための機能が組み込まれている標準モジュールです。

osモジュールを使うと、ファイルやディレクトリの操作を行う事が出来ます。まずは、osモジュールを使用するにはモジュールそのものをインポートする必要があります。

このようにosモジュールをインポートしてみましょう。

import os

これで、「os.(関数名)」でosモジュールの機能にアクセスすることが出来るようになります。これ以降のコードはインポートしたものとして、import osの一行は省略します。

またこれらの操作についてよくわからない方は、こちらの記事もご覧ください。

はじめてのPython!パッケージをimportする方法をやさしく解説!
更新日:2022年9月13日

ディレクトリを作成する

では実際に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モジュールを使う上での大きな特徴となります。

正規表現については、これらの記事を見てみると理解がより深まりますよ!

【Python入門】正規表現による文字列置換をマスターしよう|re.sub
更新日:2022年9月13日
【Python入門】正規表現の使い方を初心者向けに解説
更新日:2022年9月13日

こちらのサンプルコードを見てみましょう。

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 入門完全攻略ガイド

プログラミング学習の挫折率は約90%と言われています。学習を成功させるには、モチベーションを維持して成長を実感できる環境が必要です。

侍エンジニアなら「現役エンジニア講師」、「学習コーチ」、「Q&A掲示板」のトリプルサポート体制であなたの学習をサポートするほか、オーダーメイドカリキュラムで必要なことだけを学べるため、さまざまなランキングでNo1という実績を挙げています。

挫折せず最短でプログラミングを習得したいなら侍エンジニアがおすすめです!

詳しくはこちら

Writer

Kotono

イタリア在住15年目の22歳です。イタリアの大学で情報科学&応用数学を学んでいます。主にJavaScriptやPythonについての記事を書いたりしています。

あなたの目的に合わせた
SAMURAI ENGINEERの運営サービス

SAMURAI ENGINEER Pro

未経験でも挫折しないプログラミングスクール

詳細はこちら

SAMURAI TERAKOYA

日本最大級のサブスク型オンラインITスクール

詳細はこちら

SAMURAI ENGINEER Freelance

「一人で稼げる」スキルを身につける

詳細はこちら