Data Science|Basics

【初心者向け】Pythonのglobを徹底解説!正規表現の書き方も説明

「pythonのglobの使い方がわからなくてつまずいている。参考書にも詳しく載っていない、誰かちゃんと教えて!」

本記事ではこのような悩みを解決します。

pythonのglobの使い方は難しく、初心者がつまずきがちなポイントです。しかしglobは使いこなせればかなり便利な関数です。globの使い方を覚えるだけでpythonでのファイル操作が楽になりますよ。

そこで本記事では初心者でもわかるようにglobの使い方を解説します。globの基本的な使い方や実践的な使い方を詳しく説明しているので、ぜひご覧ください。
また、初心者が混乱しがちな正規表現の書き方についてもまとめました。

python初心者の方はぜひこの機会にglobの使い方をマスターしてしまいましょう!

pythonにおけるglobとは

まずは「そもそもglobってなに?」という点を説明します。
なぜこのような関数が必要となるのか、その理由を押さえておきましょう。

globの基本となるところなので、しっかり理解しておくようにしましょう。

globとは何か

globは、pythonのモジュールの1つです。また、globモジュールの中にある同名の関数glob()も指します。

globとは英語で「かたまり」という意味があります。pythonでは、glob関数を使うことで特定のパターンにマッチするファイルを取得することができます。特定のファイルの「かたまり」を取得する、というイメージで覚えておきましょう。

glob関数にファイルのマッチング条件を引数として与えると、その条件にマッチしたファイルを返してくれます。ファイルを取得すると、そのファイルのみを開いて、プログラム内で扱えるようになります。
マッチング条件の書き方については、この記事で詳しく解説していきますよ。

このように、特定条件に従ったファイルを取得するときにglobを使います。

globの実践方法・具体例

ここでは、globの実践方法について解説していきます。

実際にglobを使ったプログラムを作成して、ファイルを取得してみましょう。

さらに、再帰処理を使って、1つの上の階層のファイルを取得する方法も説明してあります。こちらは少し難しいですが、理解しておくと役立ちますよ。

テストファイルの準備

globを使う前に、まずはテスト用のファイルとディレクトリを準備しましょう。

まず、pythonファイルを保存するディレクトリに「test」ディレクトリを作ってください。そしてtestディレクトリの中に、以下の4つのファイルを作成します。

aaa.txt
bbb.txt
ccc.txt
ddd.text

さらに、testディレクトリの中に「test2」ディレクトリを作ってください。そしてtest2ディレクトリの中に「eee.txt」ファイルを作成します。
なお、ファイルの中身は空っぽで構いません。

作成例がこちらです。

これでglobを使う準備は完了しました。

これからglobを使って、作成したファイルを取得していきます。

globの基本的な使い方

それではglobの基本的な使い方を紹介します。

まずは「test」ディレクトリの中にあるファイルを取得していきます。
pythonファイルを作成し、次のようなソースを記述してください。

import glob
import re
import os

file = glob.glob(‘test/*.txt’)

print(file)

◯実行結果

Documents $ 1python test.py
[’test/ccc.txt’,’test/bbb.txt’,’test/aaa.txt’]/strong>
Documents $ 1

glob関数を使うためには、globモジュールを始めとして、いくつかのライブラリをimportする必要があります。冒頭のimport文のところは忘れずに記入しましょう。

記述したらファイルを保存して、プログラムを実行してみましょう。すると実行結果のように表示されるはずです。testディレクトリの中にある3つの.txtファイルが出力されました。

このプログラムでは、glob関数の引数として文字列「test/*.txt」を渡しています。これは、「testディレクトリの中にある「*.txt」というパターンに一致するファイルを取得する」という意味になります。

「*」はワイルドカード文字と呼ばれるもので「任意の文字列」を表します。結局、上記の場合、「testディレクトリの中にある拡張子.txtのファイルを取得」していることになります。ここでは、aaa.txt、bbb.txt、ccc.txtの3つがパターンに一致することになりますね。

「ddd.text」はこのパターンに合致していないので、ここでは表示されません。ddd.textを取得したい場合には次のように記述する必要があります。

import glob
import re
import os

file = glob.glob(‘test/*.text’)

print(file)

◯実行結果

Documents $ 1python test.py
[’test/ddd.text’]
Documents $ 1

すると今度は「ddd.text」のみが取得できるようになりました。

パターンの内容をglob関数内に書いて、そのパターンに一致するファイルを取得してくる。これがglobの基本的な使い方です。

ファイル名のみ取得する

先ほどの例ではファイル名と一緒にディレクトリ名も取得していました。
ではファイル名のみを取得したい場合はどうすればよいでしょうか?

その場合は、os.path.split関数を使って、ディレクトリ名とファイル名を分けるのがオススメのやり方です。
os.path.split関数は、ファイルのパスを与えるとディレクトリ名とファイル名に分割してくれる関数です。

次の例を見てください。

import glob
import re
import os

file = glob.glob(‘test/*.txt’)

print(os.path.split(f)[1])

◯実行結果

Documents $ 1python test.py
[’test/ddd.text’]
Documents $ 1

このように、os.path.split(ファイルを格納した変数名)[1]と記述することでファイル名のみを取得できます。

なお、os.path.split(f)[0]と記述するとディレクトリ名のみを取得できます。

この方法ならファイル名だけを出力させることができます。実際のコーディングではよく使うので覚えておきましょう。

正規表現について

先ほど、glob関数の引数に「test/*.txt」を渡しましたよね。

ここでの「*」は正規表現と呼ばれる書き方の1つです。正規表現とは、文字列のパターンを表現する表記法のことであり、glob関数内でも使うことができます。

たとえば「*」は「文字列が0回以上繰り返される」パターンに合致します。

正規表現には他にもたくさんの書き方があります。
たとえば「^」は行の先頭を意味する正規表現です。「^a」と書くと、これは「行の先頭がaから始まる」パターンに合致します。
他にも「$」というものがあり、こちらは行の末尾を意味する正規表現です。「t$」と書くと、これは「行の末尾がtで終わる」パターンに合致します。

正規表現は他にもたくさんの種類があります。代表的な正規表現を下にまとめました。

◯代表的な正規表現の例

正規表現 意味 使用例
* 何かしらの文字列が0回以上繰り返される *.txt
+ 何らかの文字列が1回以上繰り返される +.txt
? 何らかの文字が0回もしくは1回表示される ?.txt
{a} 何らかの文字列がa回繰り返される {3}.txt
{a,b} 何らかの文字列がa~b回繰り返される {1,3}.txt
^ 行の先頭 ^a
$ 行の末尾 t$

初心者の方は全部を一気に覚える必要はありません。pythonを勉強していく中で、必要に応じて少しずつ覚えていくようにしましょう。

1つの上の階層のファイルを取得する

pythonはバージョン3.5から「**」という正規表現が使えるようになりました。
「**」とglobを組み合わせることによって、1つの上の階層のファイルも簡単に取得ができます。

「*」だと同一階層のファイルしか取得ができません。今の例で言えば、testディレクトリのファイルは取得できても、test2ディレクトリのファイルは取得できないのです。

以下では、「**」を使ってtest2ディレクトリにある「eee.txt」を取得していきます。pythonファイルに次のように記述してください。

import glob
import re
import os

file = print(glob.glob(‘test/**/*.txt’, recursive=True))

print(file)

◯実行結果

Documents $ 1python test.py
[’test/ccc.txt’,test/bbb.txt’,’test/test2/eee.txt’]
None

Documents $ 1

print(file)

ここで、glob関数の第2引数に「recursive=True」と記述する必要があることに注意してください。
recursiveとは英語で「再帰的」という意味です。「recursive=True」と記述することで、ファイルを再帰的に探すことができるようになります。再帰処理とは、自分自身を呼び出す処理という意味です。

上記の例では「test/**/*.txt」というパターンに合致したファイルを取得しています。「**」を使うことで、testディレクトリの中のファイルとtest2ディレクトリの中のファイルの両方を取得できるようにしています。

このように、「**」を使うことで同一階層以外のファイルも探すことが可能です。この書き方が必要となることもあるので、覚えておくと良いですよ。

まとめ

本記事ではPythonのglobについて解説しました。
globを使うことでファイルの取得が簡単に行えることがお分かりいただけたでしょうか?

また、本記事では正規表現の書き方についても説明しました。
正規表現はpythonのみならず他のプログラミング言語でも使われるものです。最初のうちは慣れないと思いますが、慣れてくるととても便利になります。

ぜひ本記事を参考にしてglobの使い方や正規表現をマスターしましょう。

このブログでは他にも様々なPythonの関数について解説しています。ぜひご覧ください!

Pythonの出力関数printの要点をつかむ!基礎〜応用まで徹底解説Pythonを学習し始めたばかりの方で、print関数についてつまずいてしまう人も少なからずいるでしょう。 「Pythonのp...
マスターしよう!Pythonでimportを使う方法について徹底解説!Pythonを学習し始めたばかりの人で「import」につまずいている人もいることでしょう。 そこで今回は import...

https://www.tech-teacher.jp/blog/python-function/

本記事が初心者の方がpythonを理解する助けになれば幸いです。