【Python入門】listdir関数でデータを取得する方法

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト：[【Python入門】listdir関数でデータを取得する方法](http://programming-study.com/technology/python-lsitdir/)


#【Python入門】listdir関数でデータを取得する方法

Pythonでは特定のファイルを読み込んでデータを取得することができます。直接ファイル名を打ち込んでもいいですが、ファイル一覧を取得して、プログラム内でファイルを選択する、といったことが必要な時があります。その場合は、listdir関数を使うことでディレクトリ（フォルダ）やファイルの一覧を簡単に取得することができます。

今回は、listdir関数を使ったディレクトリとファイル一覧やパスの取得方法を解説します。

目次
1 [listdir関数でディレクトリとファイルの一覧を取得する](##listdir関数でディレクトリとファイルの一覧を取得する)
2 [lisdir関数と組み合わせて必要なものだけを取得する](##lisdir関数と組み合わせて必要なものだけを取得する)
3 [glob関数でファイルを取得する](##glob関数でファイルを取得する)

##listdir関数でディレクトリとファイルの一覧を取得する

Pythonでディレクトリとファイルの一覧を取得するにはlistdir関数を使います。listdir関数の構文は以下の通りです。

```
import os  #必ず必要

リスト変数 = os.listdir('パス')
```

istdir関数はosという名前のモジュールの関数なので、listdir関数を使う場合は必ずインポートするようにしましょう。listdirの引数に、ディレクトリとファイル一覧を取得したいディレクトリのパスを渡すことで、そのディレクトリ内にあるディレクトリとファイルの一覧を取り出す事が出来ます。

```
import os

directory = os.listdir('C:\Python35')
print(directory)
```

実行結果

>[‘Lib’, ‘python.exe’, ‘Readme.txt’, ‘Scripts’, ‘tcl’, ‘test.txt’]
lisdir関数と組み合わせて必要なものだけを取得する


##isdir関数と組み合わせて必要なものだけを取得する

listdir関数を使うと、指定したパスの中にあるすべてのフォルダとファイルの一覧を取得してしまいます。しかし、場合によってはディレクトリだけが欲しい場合や、逆にファイルだけが欲しい場合があります。そういった時は、指定したパスがディレクトリを指すのかファイルを指すのかを調べることができるisdirを併用することで実現できます。isdirの構文は以下の通りです。

```
os.path.isdir(‘パス’)
```

isdirは引数で渡されたパスがディレクトリならTrueを返し、そうでないならFalseを返します。これをlistdirと共に使うことでディレクトリだけ、もしくはファイルだけの一覧を取得できます。

```
import os
 
path = 'C:\Python35\\'  #ディレクトリ一覧を取得したいディレクトリ
files = []
 
for x in os.listdir(path):  
    if os.path.isdir(path + x):  #パスに取り出したオブジェクトを足してフルパスに
        files.append(x)
    
print(files)
```
実行結果

>[‘Lib’, ‘Scripts’, ‘tcl’]

まず、listdirでディレクトリとファイルの一覧を取得し、それをfor文で一つずつ取り出します。取り出したディレクトリ名、もしくはファイル名を元のパスの後ろに連結することで、そのディレクトリもしくはファイルのパスが作れます。

そのパスをisdirに渡せば、それがディレクトリかファイルかが分かります。この場合、isdirがTrueを返したものだけ、つまりディレクトリだけをリストに追加するようにしています。このif文を否定することで、逆にファイル文だけを取り出せます。

なお、isdirの代わりにisfileを使うと、逆にファイルだけを取り出す事が出来ます。

```
import os

path = 'C:\Python35\\'
files = []

for x in os.listdir(path):
    if os.path.isfile(path + x):  #isdirの代わりにisfileを使う
        files.append(x) 
    
print(files)
```

実行結果
>[‘python.exe’, ‘Readme.txt’, ‘test.txt’]

##glob関数でファイルを取得する

listdirとisdirおよびisfileを使うことで、ディレクトリおよびファイルの一覧を取得できるようになりました。しかし、さらに細かく指定してファイルを取得したいことがあります。
例えば、ファイルのうち、拡張子が.txtだけのものを取り出したい場合、取り出した後に文字列を操作しなければなりません。

```
import os

path = 'C:\Python35\\'
files = []
texts = []

for x in os.listdir(path):
    if os.path.isfile(path + x):
        files.append(x) 
    
for y in files:
    if(y[-4:] == '.txt'):     #ファイル名の後ろ4文字を取り出してそれが.txtなら
        texts.append(y)  #リストに追加
        
print(texts)
```

実行結果

>[‘Readme.txt’, ‘test.txt’]

しかし、この方法だとコードが複雑になりますし、拡張子によって長さも違うので毎回設定するのが面倒です。このような場合は、listdirの代わりにglob関数を使うとスッキリとします。globの構文は以下の通りです。

```
import os

path = 'C:\Python35\\'
files = []
texts = []

for x in os.listdir(path):
    if os.path.isfile(path + x):
        files.append(x) 
    
for y in files:
    if(y[-4:] == '.txt'):     #ファイル名の後ろ4文字を取り出してそれが.txtなら
        texts.append(y)  #リストに追加
        
print(texts)
```
    
glob関数はglobモジュールの関数なので、必ずglobをインポートしましょう。glob関数も引数にパスを渡しますが、listdirと違い単体のディレクトリ名だけでなく単体のファイル名を入れることができます。
また、globの引数には任意の文字列を意味するワイルドカード（*）や正規表現が使えるので、特定のファイルだけを簡単に取得できます。

```
import glob

path = 'C:\Python35\\*.txt'
files = []

files = glob.glob(path)

print(files)
```

実行結果

>[‘C:\\Python35\\Readme.txt’, ‘C:\\Python35\\test.txt’]

この例ではpathに「*.txt」を指定しているので、拡張子が.txtのファイルだけを取り出しています。glob関数を使えば、パスの指定方法を工夫することであらゆるパターンでファイルを取得できます。