Python

【5分で分かる】手を動かして解説!Pythonのglobの使い方まとめ!

glob
ウマたん
ウマたん
本記事では、Pythonでファイル取得に便利なライブラリ”glob”の使い方について見ていきます!大量のデータファイルを扱うデータ分析の場面で利用することが多いので、ぜひ使いこなせるようになりましょう!

こんにちは!スタビジ編集部です!

この記事では、Pythonでディレクトリに格納されたファイル名を抽出するのに便利なライブラリ”glob“の使い方についてまとめていきたいと思います!

ロボたん
ロボたん
複数のファイルを同時に扱えるようになると便利だな~!例えばデータの入っているcsvファイルだけを選択したい時とか!
ウマたん
ウマたん
そうだね!一つ一つファイル名を選択してってやる方法もあるけど正直面倒!

そんな時に役立つのが”glob”なんだ!

ぜひglobの基本についてしっかりおさえて扱えるようになっておきましょう!

globとは?

glob“はPython標準のライブラリの一つでディレクトリに格納されたファイル名を抽出するのに使われます!

globモジュールにはglob()やigrob()、escape()といった関数があります!

その中で、よく使われるのがglob()なのでぜひ使い方を覚えておきましょう!

glob()はファイルの抽出条件を引数として与えることで、その条件にマッチしたファイルやフォルダの一覧をリストとして返してくれます!

ただ、この抽出条件の書き方が少し難しいので実戦で見ていきましょう!

ウマたん
ウマたん
複数のファイルをまとめたりするのに使うのが”glob“!

似たような名前のファイルから一つ一つデータを取り出すときとかに便利!

globを使ってファイルを抽出してみよう!

実際にglobを使ってみましょう!

学習用のデータがある「trainフォルダ」とサンプルデータが「sample_dataフォルダ」のあるディレクトリを想定します!

glob

trainフォルダの中には分析の元になるデータがcsvファイルとして01~47まで格納されています!

では、globを使ってこのcsvファイルのファイル名を取得していきましょう!

file = glob.glob("train/01.csv")

glob()の中に習得したいファイルの条件(pathname)を記述します!

今回はtrainフォルダの中の”01.csv”を指定しました!

“file”の中身を見てみるとでファイル名が確認できます!

print(file)
>>['train/01.csv']

[‘train/01.csv’]

複数のファイルを抽出する

続いて、複数のファイルを抽出してみましょう!

方法は先ほどと同じで、glob()の中に条件を記述します!

files = glob.glob("train/*.csv")

ここの「*」はワイルドカードと呼ばれるもので特殊な意味を持ち、条件の指定に役立ちます!

globでよく使われる特殊文字を見ていきましょう!

*0文字以上の任意の文字列
?1文字の任意の文字
[文字列][]の中に含まれている文字の中の1文字
[!文字列][]の中に含まれない1文字

上の例の”train/*.csv“は「trainフォルダの中にあるcsvファイルすべてを抽出する」という意味になります!

filesの中を見てみるとデータのcsvファイルがリスト形式で格納されています!

print(files)
>>['train/43.csv', 'train/16.csv', 'train/20.csv', 'train/47.csv', 'train/31.csv', 'train/01.csv', 'train/10.csv', 'train/39.csv', 'train/09.csv', 'train/36.csv', 'train/25.csv', 'train/44.csv', 'train/11.csv', 'train/23.csv', 'train/14.csv', 'train/17.csv', 'train/04.csv', 'train/38.csv', 'train/26.csv', 'train/06.csv', 'train/21.csv', 'train/07.csv', 'train/29.csv', 'train/13.csv', 'train/27.csv', 'train/28.csv', 'train/02.csv', 'train/19.csv', 'train/22.csv', 'train/46.csv', 'train/34.csv', 'train/18.csv', 'train/35.csv', 'train/32.csv', 'train/37.csv', 'train/08.csv', 'train/24.csv', 'train/42.csv', 'train/05.csv', 'train/12.csv', 'train/30.csv', 'train/45.csv', 'train/03.csv', 'train/15.csv', 'train/40.csv', 'train/33.csv', 'train/41.csv']

 

次は、「01~09の数字がついたcsvファイル」だけを抽出してみましょう!

file1 = glob.glob("train/[0][1-9].csv")

いろんなやり方があると思いますが、今回は[]を使って条件を指定しています!

2桁目は0で固定なので[0]、1桁目は1~9の文字のどれかなので[1-9]と指定します!

“文字-文字”を使うと文字から文字までとなります!他に[a-z]と書いてa~zまでと意味で使うことが多いです!

file1の中を見てみると意図したファイル名が格納されていますね!

print(file1)
>>['train/01.csv', 'train/09.csv', 'train/04.csv', 'train/06.csv', 'train/07.csv', 'train/02.csv', 'train/08.csv', 'train/05.csv', 'train/03.csv']

 

ウマたん
ウマたん
ワイルドカードを駆使して、自分の好きなようにファイルを集めていこう!

別ディレクトリのファイルも抽出する

先ほど「glob()の中に習得したいファイルの条件(pathname)を記述します」と記載しましたが、ファイルの条件は具体的にパスを指定しているため、そのディレクトリ内を対象にしています、、、

なので、このままだと別のディレクトリにあるファイルと抽出できなくなります!

例えば、「trainフォルダ」と「testフォルダ」それぞれに目当てデータのファイルがある場合を想定します!「trainフォルダ」の中には「train2フォルダ」があり、そこにもデータがあります!

glob glob

この時、「trainフォルダ」と「testフォルダ」にあるcsvファイルを抽出したい場合”再帰的な処理“を行います!

再帰的な処理とは同じ処理を繰り返すという意味です!

今回の場合、globではディレクトリの中で条件に合うファイルを抽出してリストに格納するという処理をしています!

その処理を今のディレクトリの下のディレクトリでも繰り返し実施し、最も深い階層にあるファイルやディレクトリまで検索することが再帰的処理になります!

説明だけだと難しいので、実際にやってみましょう!

まずはtrainフォルダの中にあるcsvファイルをすべて抽出します!

file_recursive = glob.glob("train/**/*.csv", recursive=True)

「**」を使うことで、条件のpathを起点(今回はtrain)に下の階層まで条件のファイルがないか検索してくれます!

その時、recursive=True」として再帰的な検索を有効にすることを忘れずに!

print(file_recursive)
>>['train/43.csv', 'train/16.csv', 'train/20.csv', 'train/47.csv', 'train/31.csv', 'train/01.csv', 'train/10.csv', 'train/39.csv', 'train/09.csv', 'train/36.csv', 'train/25.csv', 'train/44.csv', 'train/11.csv', 'train/23.csv', 'train/14.csv', 'train/17.csv', 'train/04.csv', 'train/38.csv', 'train/26.csv', 'train/06.csv', 'train/21.csv', 'train/07.csv', 'train/29.csv', 'train/13.csv', 'train/27.csv', 'train/28.csv', 'train/02.csv', 'train/19.csv', 'train/22.csv', 'train/46.csv', 'train/34.csv', 'train/18.csv', 'train/35.csv', 'train/32.csv', 'train/37.csv', 'train/08.csv', 'train/24.csv', 'train/42.csv', 'train/05.csv', 'train/12.csv', 'train/30.csv', 'train/45.csv', 'train/03.csv', 'train/15.csv', 'train/40.csv', 'train/33.csv', 'train/41.csv', 'train/train2/98.csv', 'train/train2/99.csv', 'train/train2/97.csv']

file_recursiveを見てみると、すべてのファイルがリスト形式で格納されていますね!

最後に「trainフォルダ」と「testファイル」の中から「a.csvファイル」と「1の位が9のファイル」を抽出してみます!

files_ex = glob.glob("**/*[a,9].csv", recursive=True)
print(files_ex)
>>['train/39.csv', 'train/09.csv', 'train/29.csv', 'train/19.csv', 'train/train2/99.csv', 'test/a.csv']

別のフォルダのデータもしっかり抽出できますね!

ウマたん
ウマたん
ここまで出来れば大丈夫!globを使って自分の好きなようにデータを抽出していこう!

glob使い方まとめ

ここまでglobとはから使い方まで解説していきました!

globを使い、ワイルドカード再帰的な処理を利用することで複数のファイルを抽出出来ました!

「globの使い方はわかったけど、これをどう場面で使うの?」と思った方はぜひ以下の講座を受講してみてください!

Udemy-course

実際のデータ分析の流れを解説していて、実戦でglobがどのように使われているのか参考になります!

また、Pythonで出来ることを知りたい場合は以下の記事でまとめていますので是非チェックしてみてください!

Pythonでできること7つをコード例をまじえてまとめておく!当サイト【スタビジ】本記事では、Pythonでできることを7つまとめていきます!!Pythonで何ができるのか分からない状況から深い理解にもっていきますよー!実際にPythonでの実装例や勉強方法も取り上げているのでぜひご自分の環境で手を動かして実装してみてくださいね!...
スタビジアカデミーでデータサイエンスをさらに深く学ぼう!
スタアカトップ

スタビジのコンテンツをさらに深堀りしたコンテンツが動画と一緒に学べるスクールです。

プレミアムプランでは私がマンツーマンで伴走させていただきます!ご受講お待ちしております!

スタビジアカデミーはこちら