Pythonでディレクトリ内のファイルやディレクトリの一覧を取得する
os.listdir()は、指定したディレクトリ内に存在するファイルやサブディレクトリの名前を一覧で取得するための関数です。Pythonの標準ライブラリであるosモジュールに含まれており、ディレクトリの内容を取得してファイル操作や管理を行う際に頻繁に利用されます。
パスがファイルかディレクトリかを判定するには、osモジュールまたはpathlibモジュールを使う方法があります。
実行サンプル
import os
import pathlib
entries = os.listdir(path='.')
for entry in entries:
print(f"{type(entry)}, {entry}")
p = pathlib.Path(entry)
print(f"- file={os.path.isfile(entry)}, directory={os.path.isdir(entry)}")
print(f"- file={p.is_file()}, directory={p.is_dir()}")
取得される結果の順番(ファイルの並び)はバラバラです。
<class 'str'>, requirements.txt
- file=True, directory=False
- file=True, directory=False
<class 'str'>, Dockerfile
- file=True, directory=False
- file=True, directory=False
<class 'str'>, settings
- file=False, directory=True
- file=False, directory=True
<class 'str'>, log
- file=False, directory=True
- file=False, directory=True
<class 'str'>, .git
- file=False, directory=True
- file=False, directory=True
<class 'str'>, .gitignore
- file=True, directory=False
- file=True, directory=False
<class 'str'>, .env
- file=True, directory=False
- file=True, directory=False
<class 'str'>, docker-compose.yml
- file=True, directory=False
- file=True, directory=False
異なるディレクトリの一覧を取得した場合の属性確認
異なるディレクトリのエントリを取得し、ファイルやディレクトリの確認を行うとすべてFalseになります。これはosモジュールやpathlibモジュールが現在のディレクトリから指定されたパスを参照するためです。これを回避するためには、フルパスを指定します。
以下、サンプルのディレクリ構成
home/
+ user/
+ uploda/
- sub-dir/
- .keep
- sample.zip
プログラムを/home/userで実行する場合のNG例
import os
import pathlib
entries = os.listdir(path='./upload')
for entry in entries:
print(f"{type(entry)}, {entry}")
p = pathlib.Path(entry)
print(f"- file={os.path.isfile(entry)}, directory={os.path.isdir(entry)}")
print(f"- file={p.is_file()}, directory={p.is_dir()}")
<class 'str'>, sub-dir
- file=False, directory=False
- file=False, directory=False
<class 'str'>, .keep
- file=False, directory=False
- file=False, directory=False
<class 'str'>, sample.zip
- file=False, directory=False
- file=False, directory=False
カレントディレクトリ(/home/user)を基準に判定してしまい、実際の場所である/home/user/upload配下のパスにならず、存在しないパスとして扱われるためFalseになります。
プログラムを/home/userで実行する場合に正しく動作するコード
import os
import pathlib
target_path = '/home/user/upload'
entries = os.listdir(path=target_path)
for entry in entries:
print(f"{type(entry)}, {entry}")
full_path = os.path.join(target_path, entry)
p = pathlib.Path(full_path)
print(f"- file={os.path.isfile(full_path)}, directory={os.path.isdir(full_path)}")
print(f"- file={p.is_file()}, directory={p.is_dir()}")
<class 'str'>, sub-dir
- file=False, directory=True
- file=False, directory=True
<class 'str'>, .keep
- file=True, directory=False
- file=True, directory=False
<class 'str'>, sample.zip
- file=True, directory=False
- file=True, directory=False
フルパスを指定することで実際のパスが参照できます。
