フォルダのファイル一覧を取得する(osモジュール)

このブログはWindowsパソコンでPythonを実行している想定になっています。

基本の使い方(os モジュール)

フォルダとファイルの両方を取得ができます。

import os

# フォルダのパス
folder_path = 'C:/example/'

# フォルダ内のすべてのファイルとフォルダを取得
all_items = os.listdir(folder_path)
print(all_items)

print(all_items)の出力結果です。

['a.txt', 'b.txt', 'blog_os.py', 'folder']

フォルダとファイルを一緒に取得できます。一般的にはWindowsパソコンであれば .txt で終わればファイルであり、 ピリオド . が無い場合はフォルダーです。

※注記:厳密には「ピリオドが無いファイル」や「ピリオドが有るフォルダ」も存在します。記事では「一般的には・・・です」を前提にして話を進めます。

os.listdir() は「ディレクトリ名のみ」を引数に取ります。

os.listdir(‘C:/example/’) は、正しく動作します。

os.listdir(‘*.txt’) は、エラーになります。

OSError: [WinError 123] ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。: '*.txt'

エラーになる理由は「*.txt」というディレクトリ(フォルダ)を探しているからです。ワイルドカードを含むディレクトリ(フォルダ)は存在しません。Windowsパソコンで*を含めたフォルダを作ろうとすると拒否されます。

os.listdir() の引数は「ディレクトリ名のみ」と覚えましょう。

ファイルだけに絞りたい場合

os.path.isfile() を使って、ファイルだけに絞れます。

import os

folder_path = 'C:/example/'

# フォルダ内の全ての項目を取得
all_items = os.listdir(folder_path)
print(f'#1 フォルダ内の全ての項目を取得\n{all_items}\n')


# ファイルだけを抽出
file_list = []
for f in all_items:
    path = os.path.join(folder_path, f)
    if os.path.isfile(path):
        print(f'#2-1 ファイルのパス\n{path}')
        file_list.append(f)

print('\n')
print(f'#2-2 ファイル一覧\n{file_list}\n')

実行結果です。

#1 フォルダ内の全ての項目を取得
['a.txt', 'b.txt', 'blog_os.py', 'folder']

#2-1 ファイルのパス
C:/example/a.txt
#2-1 ファイルのパス
C:/example/b.txt
#2-1 ファイルのパス
C:/example/blog_os.py


#2-2 ファイル一覧
['a.txt', 'b.txt', 'blog_os.py']

フォルダだけに絞りたい場合

os.path.isfile(path) を os.path.isdir(path) に変更します。

先程のコードからの変更点を赤文字で表記しました。詳細説明は割愛しますが、 os.path.join(folder_path, f) は、各ファイルをフルパスで指定するためです。

import os

folder_path = 'C:/example/'

# フォルダ内の全ての項目を取得
all_items = os.listdir(folder_path)
print(f'#1 フォルダ内の全ての項目を取得\n{all_items}\n')


# フォルダだけを抽出
dir_list = []
for f in all_items:
    path = os.path.join(folder_path, f)
    if os.path.isdir(path):
        print(f'#2-1 フォルダのパス\n{path}')   
        dir_list.append(f)

print('\n')
print(f'#2-2 フォルダ一覧\n{dir_list}\n')
#1 フォルダ内の全ての項目を取得
['a.txt', 'b.txt', 'blog_os.py', 'folder']

#2-1 フォルダのパス
C:/example/folder


#2-2 フォルダ一覧
['folder']

サブフォルダも含めて一覧を取得したい場合

os.walk() を使います。

import os

folder_path = 'C:/example/'

for root, dirs, files in os.walk(folder_path):
    for file in files:
        print(os.path.join(root, file))

実行結果です。

C:/example/a.txt
C:/example/b.txt
C:/example/blog_os.py
C:/example/folder\c.txt
C:/example/folder\d.txt

まとめ

import os

folder_path = 'C:/example/'

# フォルダ内の全ての項目を取得
all_items = os.listdir(folder_path)
print(f'#1 フォルダ内の全ての項目を取得\n{all_items}\n')

# フォルダとファイルを抽出
file_list = []
dir_list = []
sonota_list = []
for f in all_items:
    path = os.path.join(folder_path, f)
    if os.path.isfile(path):
        file_list.append(f)
    elif os.path.isdir(path):
        dir_list.append(f)
    else:  
        sonota_list.append(f)

print(f'#2 ファイル一覧\n{file_list}\n')
print(f'#2 フォルダ一覧\n{dir_list}\n')
print(f'#2 その他のパス\n{sonota_list}\n')

実行結果です。

#1 フォルダ内の全ての項目を取得
['a.txt', 'b.txt', 'blog_os.py', 'folder']

#2 ファイル一覧
['a.txt', 'b.txt', 'blog_os.py']

#2 フォルダ一覧
['folder']

#2 その他
[]

以上、osモジュールでフォルダ一覧とファイル一覧を取得する方法を紹介しました。

おまけ(globモジュールの場合)

「指定フォルダの通常ファイルだけ取得する」であれば *.* で指定します。

import glob

# 指定フォルダのみ
all_items = glob.glob('C:/example/*.*')
for item in all_items:
        print(item)

実行結果です。

C:/example\a.txt
C:/example\b.txt
C:/example\blog_os.py

「業務の自動化」の視点では、「1つのフォルダを指定して、かつ、1つ拡張子を指定する」場合が大半です。

「txtファイルだけ → *.txt」、「pdfファイルだけ → *.pdf」と指定するだけなので、普段使いはglobが便利です。

os.listdirmまたはos.workは、隠しファイルや特殊ファイルなども含めて「厳密にフォルダの中にある一覧を取得する」場合に使います。