Pythonのos
, glob
モジュールを使ってディレクトリ名(フォルダ名)、ファイル名の一覧をリストで取得する方法について説明します。サブディレクトリ内も含めて再帰的に取得する方法も解説していきます。
使用モジュール
インストール:不要
インストール:不要
ディレクトリ構成の例
以下のようなファイル、ディレクトリ構成を例とします。
└── test
├── dir1
│ ├── file11.txt
│ └── subdir01
│ └── file12.txt
├── dir2
├── file1.txt
├── file2.txt
└── file03.txt
ファイル名とディレクトリ名の一覧を取得
ディレクトリ名とファイル名を取得するには os.listdir()
を使用します。
ただし、指定したディレクトリ直下のディレクトリとファイルのみの取得になります。
サブディレクトリも含めて全てのリストを取得したい場合は、後述の再帰的な取得方法を参照してください。
1 2 3 4 | path ="test" files = os.listdir(path) print(files) # ['dir1', 'dir2', 'file1.txt', 'file2.txt', 'file03.txt'] |
以下のように1行で書いてもOK
1 2 | print(os.listdir('test')) # ['dir1', 'dir2', 'file1.txt', 'file2.txt', 'file03.txt'] |
ファイル名の一覧を取得
ファイル名を取得する方法を解説します。
osモジュールを使用
まず os.listdir()
でディレクトリ名とファイル名を取得します。
次に、指定したパスがファイルかどうかを判定するos.path.isfile()
を使ってファイルのみを抽出します。
1 2 3 4 5 6 7 8 9 10 11 12 | import os path ="test" filelist = [] files = os.listdir(path) for filename in files: if os.path.isfile(os.path.join(path, filename)): filelist.append(filename) print(filelist) # ['file1.txt', 'file2.txt', 'file03.txt'] |
globモジュールを使用
glob
モジュールを使ってもファイル名を取得することもできます。
glob
モジュールは指定パス内でパターンに一致する全てのパス名を見つけるため、ファイルを抽出するためにワイルドカードを使い*.*
を追加します。(.*
で全ての拡張子を表します)
1 2 3 4 5 6 7 | import glob path ="test/*.*" filelist = glob.glob(path) print(filelist) #['test\\file1.txt', 'test\\file2.txt', 'test\\file03.txt'] |
ただし、取得した結果には親ディレクトリ名も含まれてしまう為、ファイル名のみ必要な場合は、os.path.basename()
で末尾のファイル名のみを抽出する必要があります。
1 2 | print([os.path.basename(f) for f in filelist]) # ['file1.txt', 'file2.txt', 'file03.txt'] |
ディレクトリ名の一覧を取得
ディレクトリ名を取得する方法を解説します。
osモジュールを使用
まず os.listdir()
でディレクトリ名とファイル名を取得します。
次に 指定したパスがディレクトリかどうかを判定するos.path.isdir()
を使い、ディレクトリのみ抽出します。
1 2 3 4 5 6 7 8 9 | path ="test" dirlist = [] files = os.listdir(path) for filename in files: if os.path.isdir(os.path.join(path, filename)): dirlist.append(filename) print(dirlist) # ['dir1', 'dir2'] |
globモジュールを使用
glob
モジュールでは以下のように記述します。パスの末尾にディレクトリの区切り文字/
を付けることでディレクトリ名のみを抽出することができます。
1 2 3 4 | path ="test/*/" dirlist = glob.glob(path) print(dirlist) # ['test\\dir1\\', 'test\\dir2\\'] |
結果の親ディレクトリ名を除くには、末尾の\\
を削除してからos.path.basename()
でディレクトリ名を抽出します。
1 2 | print([os.path.basename(d.rstrip('\\')) for d in dirlist]) # ['dir1', 'dir2'] |
条件に一致するファイルやディレクトリを取得する
globモジュールを使用
指定したディレクトリ以下に配置されているサブディレクトリ名や、ファイル名を取得する場合には、glob.glob()
を利用します。
第一引数に検索対象とするパスを指定しますが、この時にワイルドカードを使用することで条件にマッチしたリストを取得することができます。
使用できるワイルドカードは以下になります。
記号 | 説明 |
---|---|
* | 長さ0文字以上の任意の文字列 |
? | 任意の一文字 |
[ – ] | [ – ]の範囲内に含まれる文字列 |
** | あらゆるファイルや0個以上のディレクトリ、サブディレクトリにマッチ 再帰的な処理で引数 recursive=True とセットで利用する。Python3.5からサポート。 |
* を使用して、ディレクトリ内の全てのディレクトリとファイル名を取得する
1 2 3 4 5 6 7 8 | path ="test/*" list = glob.glob(path) print(list) # ['test\\dir1', 'test\\dir2', 'test\\file03.txt', 'test\\file1.txt', 'test\\file2.txt'] print([os.path.basename(p) for p in list]) # ['dir1', 'dir2', 'file03.txt', 'file1.txt', 'file2.txt'] |
?を使用して、file+任意の1文字を含むファイル名を取得します。
1 2 3 4 5 6 7 | path ="test/file?.txt" list = glob.glob(path) print(list) # ['test\\file1.txt', 'test\\file2.txt'] print([os.path.basename(p) for p in list]) # ['file1.txt', 'file2.txt'] |
[ – ]を使用して、”file”+任意の半角英字1文字から始まるファイル名を取得します。
1 2 3 4 5 6 7 | path ="test/file[0-9][0-9].txt" list = glob.glob(path) print(list) # ['test\\file03.txt'] print([os.path.basename(p) for p in list]) # [file03.txt] |
ファイル名とディレクトリ名を再帰的に取得
サブディレクトリも含めて全てのファイル名とディレクトリ名を取得する方法を解説します。
osモジュールを使用
os.walk()
を使用します。引数には対象とする先頭ディレクトリのパスを指定します。
検索順序はデフォルトではトップダウン(上から下へ)ですが、第二引数でtopdown=Flase
と指定すると、ボトムアップ(下から上へ)に変更できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | path = 'test' dirlist = [] filelist = [] for curdir, dirs, files in os.walk(path): if len(dirs) > 0: dirlist += dirs if len(files) > 0: filelist += files print('ディレクトリ: ', dirlist) print('ファイル: ', filelist) # ディレクトリ: ['dir1', 'dir2', 'subdir01'] # ファイル: ['file03.txt', 'file1.txt', 'file2.txt', 'file11.txt', 'file12.txt'] |
ボトムアップの場合は以下のようになります。
結果のリストが、最下層からの順番に変わっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | path = 'test' dirlist = [] filelist = [] for curdir, dirs, files in os.walk(path, topdown=Flase): if len(dirs) > 0: dirlist += dirs if len(files) > 0: filelist += files print('ディレクトリ: ', dirlist) print('ファイル: ', filelist) # ディレクトリ: ['subdir01', 'dir1', 'dir2'] # ファイル: ['file12.txt', 'file11.txt', 'file03.txt', 'file1.txt', 'file2.txt'] |
globモジュールを使用
glob.glob()
を使用します。
引数に検索対象のパスとして test/**
のようにワイルドカードを2個並べて、第二引数にrecursive=True
を指定することで再帰的に走査する事ができます。
ただし、指定したパス自身も結果に含まれてしまうため、結果リストの1番目の要素を削除します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | path ="test/**" dirlist = [] filelist = [] list = glob.glob(path, recursive=True) del list[0] for p in list: if os.path.isdir(p): dirlist.append(os.path.basename(p)) if os.path.isfile(p): filelist.append(os.path.basename(p)) print('ディレクトリ: ', dirlist) print('ファイル: ', filelist) # ディレクトリ: ['dir1', 'subdir01', 'dir2'] # ファイル: ['file11.txt', 'file12.txt', 'file03.txt', 'file1.txt', 'file2.txt'] |
対象パスに条件を指定して、マッチしたものだけを抽出することもできます。
以下の例では拡張子がtxtのファイルを対象として抽出しています。
1 2 3 4 5 | path ="test/**/*.txt" filelist = glob.glob(path, recursive=True) print([os.path.basename(f) for f in filelist]) # ['file03.txt', 'file1.txt', 'file2.txt', 'file11.txt', 'file12.txt'] |
Pythonのos
モジュール、glob
モジュールを使ってディレクトリ名、ファイル名を取得する方法について解説しました。