2017/02/28

Python でディレクトリ内のファイル一覧を取得する方法3種

微妙に動作が違ってすぐ迷うので備忘録1

例として、こんなディレクトリ構造を使用します。

.
└── dir
    ├── a.txt
    ├── b.txt
    ├── c.jpg
    └── subdir
        ├── d.yaml
        └── e.conf

単純にリストで取得

最もシンプルな方法。結果はファイル名のみ。

1
2
3
4
5
6
7
>>> for file in os.listdir("dir"):
...     print(file)
...
subdir
a.txt
b.txt
c.jpg

以下のようにサブディレクトリを指定した場合でも結果はファイル名のみなので、その後の処理2はパスの補完が必要になることが多いです。

1
2
3
4
5
>>> for file in os.listdir(os.path.join("dir", "subdir")):
...     print(file)
...
d.yaml
e.conf

ワイルドカードを使う

拡張子でフィルタする等、ワイルドカードを使用したい場合は glob.glob() を使うと便利です。結果は指定したパスを含みます。

1
2
3
4
5
>>> for file in glob.glob(os.path.join("dir", "*.txt")):
...     print(file)
...
dir/a.txt
dir/b.txt

再帰的にサブディレクトリまで探索

サブディレクトリまで全部取得したい場合は os.walk() が使えます。

1
2
3
4
5
6
7
8
9
10
>>> for root, dirs, files in os.walk("dir"):
...     print("{0}\n   {1} (dirs)\n   {2} (files)\n".format(root, dirs, files))
...
dir
   ['subdir'] (dirs)
   ['a.txt', 'b.txt', 'c.jpg'] (files)
 
dir/subdir
   [] (dirs)
   ['d.yaml', 'e.conf'] (files)

os.walk() はタプルのリストを返します。 少々扱いづらいので、単純な処理の場合は関数化してしまうと楽かもしれません。

参考

  1. 動作確認は Python 2.7.12 と 3.5.2 で行いました 
  2. 例えば、 os.path.isdir() で処理を分ける等 
?

0 件のコメント: