Python|glob.glob() 使い方 ファイル名 取得 ディレクトリ一覧 リスト 拡張子なし

import glob
filedir = 'C:/Users/Downloads'
files = glob.glob(filedir+'/*.csv')
for file in files:
	with open(file, 'r') as f:
		f.read()

上のサンプルプログラムは、glob.glob()を使ってCSVファイルを取得して、for文でファイルを順に読み込みする処理をしています。

ディレクトリ一覧

glob.glob(pathname)

C:/Users/Downloads
├ photo.jpg
├ data.csv
├ demo.csv
├ test.csv
└ /subfolder
  └ addr.csv
import glob
filedir = 'C:/Users/Downloads'
files = glob.glob(filedir+'/*.csv')
print(files)
[‘C:/Users/Downloads\\data.csv’, ‘C:/Users/Downloads\\demo.csv’, ‘C:/Users/Downloads\\test.csv’]

glob.glob()を使うと、指定した拡張子のファイルディレクトリをリスト(一覧)で取得できます。

下層フォルダのファイル

import glob
filedir = 'C:/Users/Downloads'
files = glob.glob(filedir+'/**/*.csv', recursive=True)
print(files)
[‘C:/Users/Downloads\\data.csv’, ‘C:/Users/Downloads\\demo.csv’, ‘C:/Users/Downloads\\test.csv’, ‘C:/Users/Downloads\\subfolder\\addr.csv’]

下層フォルダのファイルを再帰的に取得することができます。

この例では、CSVファイルを下層フォルダまで検索して取得しています。**の記述ですべての下層フォルダを検索します。第2引数のrecursive=Trueは再帰処理を有効にする命令です。

フォルダ名のみ

C:/Users/Downloads
├ /folder01
│ ├ data.csv
│ └ demo.csv
└ /folder02
  ├ addr.csv
  └ test.csv
import glob
filedir = 'C:/Users/Downloads'
folders = glob.glob(filedir+'/**/')
print(folders)
[‘C:/Users/Downloads\\folder01’, ‘C:/Users/Downloads\\folder02’]

glob.glob()でフォルダ名のみを取得するときは、/**/を指定します。

ファイル名のみ 取得 拡張子なし

C:/Users/Downloads
├ photo.jpg
├ data.csv
├ demo.csv
├ test.csv
└ /subfolder
  └ addr.csv
import glob
import os
filedir = 'C:/Users/Downloads'
files = glob.glob(filedir+'/*')
filenames = []
for file in files:
	filename = os.path.splitext(os.path.basename(file))[0]
	filenames.append(filename)
print(filenames)
[‘photo’, ‘data’, ‘demo’, ‘test’, ‘subfolder’]

glob.glob()で取得したファイルの拡張子を除去するときは、os.path.splitext()で分割されたタプルの[0]を指定します。

正規表現

文字 意味
* すべての文字列 /*.csv
/**/*.csv
? 1文字 /????.csv(4文字)
/20??.csv(20から始まる4文字)
[] 指定の1文字 /*[0-9][0-9].csv(2桁番号付き)
/[d]*.csv(dから始まる)
C:/Users/Downloads
├ data.csv
├ demo.csv
└ /subfolder
  ├ sample.py
  └ addr.csv
#sample.py
import glob
filedir = 'C:/Users/Downloads'
files = glob.glob(filedir+'/*.csv')
print(files)
[‘C:/Users/Downloads\\data.csv’, ‘C:/Users/Downloads\\demo.csv’]

上の例では、「d」から始まるCSVファイルを取得しています。

絶対パス

C:/Users/Downloads
├ data.csv
├ demo.csv
└ /subfolder
  ├ sample.py
  ├ addr.csv
  └ test.csv
#sample.py
import glob
filedir = 'C:/Users/Downloads'
files = glob.glob(filedir+'/*.csv')
print(files)
[‘C:/Users/Downloads\\data.csv’, ‘C:/Users/Downloads\\demo.csv’]

glob.glob()で指定するパス(ディレクトリ)は、取得したいファイルが入っているフォルダを絶対パスで指定できます。

パスの区切りは、次のどれかのように書くことができます。

  • r'C:\Users\Downloads'
  • 'C:\\Users\\Downloads'
  • 'C:/Users/Downloads'

相対パス

C:/Users/Downloads
├ data.csv
├ demo.csv
└ /subfolder
  ├ sample.py
  ├ addr.csv
  └ test.csv
#sample.py
import glob
files = glob.glob('./*.csv')
print(files)
[‘.\\addr.csv’, ‘.\\test.csv’]

glob.glob()./を指定すると、実行ファイル(例:sample.py)と同じ階層のファイルを取得できます。

ファイル 取得 上の階層

#sample.py
import glob
files = glob.glob('./../*.csv')
print(files)
[‘./..\\data.csv’, ‘./..\\demo.csv’]

glob.glob()./../を指定すると、実行ファイル(例:sample.py)の上の階層のファイルを取得できます。

複数フォルダ

C:/Users/Downloads
├ /folder01
│ ├ data.csv
│ └ demo.csv
└ /folder02
  ├ addr.csv
  └ test.csv
import glob
filedir = 'C:/Users/Downloads'
files = glob.glob('/**/*.csv')
print(files)
[‘C:/Users/Downloads\\folder01\\data.csv’, ‘C:/Users/Downloads\\folder01\\demo.csv’, ‘C:/Users/Downloads\\folder02\\addr.csv’, ‘C:/Users/Downloads\\folder02\\test.csv’]

同じディレクトリ配下の複数フォルダからファイルを取得するときは、絶対パスから下層ディレクトリを参照します。

異なるディレクトリの複数フォルダ

C:/Users/Downloads
├ data.csv
└ demo.csv
C:/pysuki
├ addr.csv
└ test.csv
import glob
filedirs = ['C:/Users/Downloads', 'C:/pysuki']
files = []
	for filedir in filedirs:
	files.extend(glob.glob('filedir+/*.csv'))
print(files)
[‘C:/Users/Downloads\\data.csv’, ‘C:/Users/Downloads\\demo.csv’, ‘C:/pysuki\\addr.csv’, ‘C:/pysuki\\test.csv’]

ファイル数 カウント

C:/Users/Downloads
├ photo.jpg
├ data.csv
├ demo.csv
├ test.csv
└ /subfolder
  └ addr.csv
import glob
filedir = 'C:/Users/Downloads'
files = glob.glob(filedir+'/*.csv')
print(len(files))
3

glob.glob()で取得したファイル(ディレクトリ)はリストになっています。リストの要素をカウントするlen(list)を使うと、リスト内のファイル数をカウントできます。

ファイル 見つからない

  • パスの書き方を間違えている
  • 正規表現の書き方を間違えている

glob — Unix 形式のパス名のパターン展開 — Python 3.10.0b2 ドキュメント

タイトルとURLをコピーしました