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

フルパスを指定することで実際のパスが参照できます。

このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です