2017/02/28

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

微妙に動作が違ってすぐ迷うので備忘録動作確認は Python 2.7.12 と 3.5.2 で行いました。

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

```text
`gutter: false;
.
└── dir
    ├── a.txt
    ├── b.txt
    ├── c.jpg
    └── subdir
        ├── d.yaml
        └── e.conf
```




### 単純にリストで取得
最もシンプルな方法。結果はファイル名のみ。

```python
>>> for file in os.listdir("dir"):
...     print(file)
... 
subdir
a.txt
b.txt
c.jpg
```

以下のようにサブディレクトリを指定した場合でも結果はファイル名のみなので、その後の処理例えば、 `os.path.isdir()` で処理を分ける等はパスの補完が必要になることが多いです。

```python
>>> for file in os.listdir(os.path.join("dir", "subdir")):
...     print(file)
... 
d.yaml
e.conf
```


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

```python
>>> for file in glob.glob(os.path.join("dir", "*.txt")):
...     print(file)
... 
dir/a.txt
dir/b.txt
```


### 再帰的にサブディレクトリまで探索
サブディレクトリまで全部取得したい場合は `os.walk()` が使えます。

```python
>>> 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()` はタプルのリストを返します。
少々扱いづらいので、単純な処理の場合は関数化してしまうと楽かもしれません。

> 参考
> - [Pythonで再帰的にファイル・ディレクトリを探して出力する - Qiita](http://qiita.com/suin/items/cdef17e447ceeff6e79d)

0 件のコメント: