このブログは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は、隠しファイルや特殊ファイルなども含めて「厳密にフォルダの中にある一覧を取得する」場合に使います。