Pythonを使ってディレクトリ内のファイルの一覧をリストに格納する色々な方法

スポンサーリンク

この記事では、Pythonを使用してディレクトリ内のファイルを一覧表示する方法について知っておく必要があるすべてのことをカバーします。

Pythonはデータサイエンスや機械学習、Web開発など様々な分野で使用されている汎用言語です。

Python言語の応用に制限はないようです。

したがって、Pythonはどのようなシステムでもファイルやディレクトリを一覧表示するために使用することができ、それは非常に些細なことのように思われます。

この記事の目的は、Pythonを使用してシステム内のファイルを一覧表示する方法について読者に説明することです。

スポンサーリンク

Python を使ったディレクトリ内の全ファイルのリストアップ

Pythonを使ってシステム内のディレクトリを操作するために、osライブラリが使用されています。

1. os’ ライブラリの使用

今回、動機のために演習するメソッドは、listdir()です。

その名の通り、ディレクトリ内の項目をリストアップするために使用されます。

# Importing the os library
import os
 
# The path for listing items
path = '.'
 
# The list of items
files = os.listdir(path)
 
# Loop to print each filename separately
for filename in files:
    print(filename)

を出力します。

game_file.py
hi-lo_pygame.py
Journaldev
list_files1.py
hi_lo_pygame.mp4
test.py
list_files.py
my_program.cpp
a.out
cut.cpp

Linuxユーザーは、ターミナル上の標準的な ls コマンドを使用して、上記の出力に簡単に一致させることができます。

# Importing the glob library
import glob
 
# Path to the directory
path = ''
 
# or
# path = './'
 
# Extract the list of filenames
files = glob.glob(path + '*', recursive=False)
 
# Loop to print the filenames
for filename in files:
    print(filename)

見ての通り、各方法の出力は一致します。

2. glob’ ライブラリの使用

glob` はファイル名のパターンマッチングを行うライブラリですが、カレントディレクトリにあるアイテムの一覧を表示するためにも使用できます。

game_file.py
hi-lo_pygame.py
Journaldev
list_files1.py
hi_lo_pygame.mp4
test.py
list_files.py
my_program.cpp
a.out
cut.cpp

結果を出力すると、以下の様になります。

# Importing the os library
import os
 
# The path for listing items
path = '.'
 
# List of only files
files = [f for f in os.listdir(path) if os.path.isfile(f)]
 
# Loop to print each filename separately
for filename in files:
    print(filename)

ワイルドカード文字 '*' は、カレントディレクトリにあるすべての項目にマッチするように使用されます。

カレントディレクトリのアイテムを表示したいので、glob()関数の再帰的な性質をオフにする必要があります。

3. カレントディレクトリにあるファイルのみをリストアップする

上記のメソッドでは、pythonコードはカレントディレクトリにあるすべてのアイテムを、その性質に関係なく返していました。

そこで、osライブラリの path.isfile() 関数を用いて、ファイルのみを抽出することができます

game_file.py
hi-lo_pygame.py
list_files1.py
hi_lo_pygame.mp4
test.py
list_files.py
my_program.cpp
a.out
cut.cpp

結果は以下の通りです。

# Importing the os library
import os
 
# The path for listing items
path = './Documents/'
 
# List of files in complete directory
file_list = []
 
"""
    Loop to extract files inside a directory
 
    path --> Name of each directory
    folders --> List of subdirectories inside current 'path'
    files --> List of files inside current 'path'
 
"""
for path, folders, files in os.walk(path):
    for file in files:
        file_list.append(os.path.join(path, file))
 
# Loop to print each filename separately
for filename in file_list:
    print(filename)

上記のコードでは、List Comprehensionを使って、実際にファイルである項目のみをフィルタリングしています。

もう一つ重要なことは、変数 'f' が絶対パスではなく、カレントディレクトリからの相対パスであるため、上記のコードは他のディレクトリでは動作しないことです。

再帰的にディレクトリ内の全ファイルをリストアップする

あるディレクトリとそのサブディレクトリ内のファイルを表示するためには、それらを再帰的にたどる必要があります。

1. os’ ライブラリの使用

walk()` メソッドを使うと、ディレクトリ内のサブディレクトリを一つずつたどることができる。

./Documents/game_file.py
./Documents/hi-lo_pygame.py
./Documents/list_files1.py
./Documents/hi_lo_pygame.mp4
./Documents/test.py
./Documents/list_files.py
./Documents/my_program.cpp
./Documents/a.out
./Documents/cut.cpp
./Documents/Journaldev/mastermind.py
./Documents/Journaldev/blackjack_terminal.py
./Documents/Journaldev/lcm.cpp
./Documents/Journaldev/super.cpp
./Documents/Journaldev/blackjack_pygame.py
./Documents/Journaldev/test.java

結果は以下の通りです。

# Importing the glob library
import glob
 
# Importing the os library
import os
 
# Path to the directory
path = './Documents/'
 
# Extract all the list of items recursively
files = glob.glob(path + '**/*', recursive=True)
 
# Filter only files
files = [f for f in files if os.path.isfile(f)]
 
# Loop to print the filenames
for filename in files:
    print(filename)

os.walk()メソッドは、デフォルトでは単に各サブディレクトリをたどり、トップダウン方式でファイルを抽出します。

os.walk()関数の出力を確認するために、3つのイテレータが使用されます。

  • path – この変数には、特定のイテレーションにおいて、関数が観測している現在のディレクトリが格納されます。
  • folders'path' ディレクトリの中にあるディレクトリのリストです。
  • files'path' ディレクトリの中にあるファイルのリストです。

join()` メソッドを用いて、ファイル名とその親ディレクトリを連結し、ファイルへの相対パスを提供します。

2. glob’ ライブラリの使用

上記の手順と同様に、globは各ディレクトリを再帰的に訪問し、すべてのアイテムを取り出して返すことができる。

./Documents/game_file.py
./Documents/hi-lo_pygame.py
./Documents/list_files1.py
./Documents/hi_lo_pygame.mp4
./Documents/test.py
./Documents/list_files.py
./Documents/my_program.cpp
./Documents/a.out
./Documents/cut.cpp
./Documents/Journaldev/mastermind.py
./Documents/Journaldev/blackjack_terminal.py
./Documents/Journaldev/lcm.cpp
./Documents/Journaldev/super.cpp
./Documents/Journaldev/blackjack_pygame.py
./Documents/Journaldev/test.java

結果を出力すると、以下の様になります。

# Importing the os library
import os
 
# The path for listing items
path = './Documents/'
 
# List of folders in complete directory
folder_list = []
 
"""
    Loop to extract folders inside a directory
 
    path --> Name of each directory
    folders --> List of subdirectories inside current 'path'
    files --> List of files inside current 'path'
 
"""
for path, folders, files in os.walk(path):
    for folder in folders:
        folder_list.append(os.path.join(path, folder))
 
# Loop to print each foldername separately
for foldername in folder_list:
    print(foldername)

パス変数と一緒に使われる '**' シンボルは、 glob() 関数に対して、任意のサブディレクトリ内のファイルにマッチするように指示します。

‘*’` は、ディレクトリ内のすべてのアイテムにマッチするように指示します。

ここでは、完全なディレクトリ内のファイルのみを抽出したいので、先ほど使用した isfile() 関数を使用してファイルをフィルタリングします。

ディレクトリ内の全サブディレクトリの一覧表示

ファイルをリストアップする代わりに、特定のディレクトリに存在するすべてのサブディレクトリをリストアップすることができます

./Documents/Journaldev

を出力します。

# Importing the os library
import os
 
# The path for listing items
path = './Documents/'
 
# List of files in complete directory
file_list = []
 
"""
    Loop to extract files inside a directory
 
    path --> Name of each directory
    folders --> List of subdirectories inside current 'path'
    files --> List of files inside current 'path'
 
"""
for path, folders, files in os.walk(path):
    for file in files:
        file_list.append(os.path.abspath(os.path.join(path, file)))
 
# Loop to print each filename separately
for filename in file_list:
    print(filename)

ファイルのリストとディレクトリのリストの細かい違いは、os.walk()関数の処理でイテレータを選択することです。

ファイルの場合は、files変数に対して反復処理を行います。

ここでは、folders変数に対してループしています。

絶対パスでディレクトリ内のファイルを一覧表示する

ディレクトリ内のファイルをリストアップする方法がわかったら、絶対パスを表示するのは簡単です。

abspath()`メソッドを使えば、ファイルの絶対パスを表示することができます

/home/aprataksh/Documents/game_file.py
/home/aprataksh/Documents/hi-lo_pygame.py
/home/aprataksh/Documents/list_files1.py
/home/aprataksh/Documents/hi_lo_pygame.mp4
/home/aprataksh/Documents/test.py
/home/aprataksh/Documents/list_files.py
/home/aprataksh/Documents/my_program.cpp
/home/aprataksh/Documents/a.out
/home/aprataksh/Documents/cut.cpp
/home/aprataksh/Documents/Journaldev/mastermind.py
/home/aprataksh/Documents/Journaldev/blackjack_terminal.py
/home/aprataksh/Documents/Journaldev/lcm.cpp
/home/aprataksh/Documents/Journaldev/super.cpp
/home/aprataksh/Documents/Journaldev/blackjack_pygame.py
/home/aprataksh/Documents/Journaldev/test.java

結果は以下の通りです。

# Importing the os and fnmatch library
import os, fnmatch
 
# The path for listing items
path = './Documents/'
 
# List of files in complete directory
file_list = []
 
"""
    Loop to extract files containing word "file" inside a directory
 
    path --> Name of each directory
    folders --> List of subdirectories inside current 'path'
    files --> List of files inside current 'path'
 
"""
print("List of files containing "file" in them")
for path, folders, files in os.walk(path):
    for file in files:
        if fnmatch.fnmatch(file, '*file*'):
            file_list.append(os.path.join(path, file))
 
# Loop to print each filename separately
for filename in file_list:
    print(filename)

ここで一つ注意しなければならないのは、abspath()にはファイルの相対パスを与えなければならないということです。

これは join() 関数の目的でもあります。

パターンのマッチングによりディレクトリ内のファイルをリストアップする

特定のパターンにマッチするファイル名をフィルタリングする方法は、複数存在します。

ひとつひとつ見ていきましょう。

1. fnmatch’ ライブラリの使用法

名前が示すように、 fnmatch はファイル名のパターンマッチングを行うライブラリです。

fnmatch` を標準のファイル名抽出ライブラリと一緒に使うことで、特定のパターンにマッチするファイルをフィルタリングすることができる。

List of files containing "file" in them
./Documents/game_file.py
./Documents/list_files1.py
./Documents/list_files.py

結果を出力すると、以下の様になります。

# Importing the glob library
import glob
 
# Importing the os library
import os
 
# Path to the directory
path = './Documents/'
 
# Extract items containing numbers in name
files = glob.glob(path + '**/*[0-9]*.*', recursive=True)
 
# Filter only files
files = [f for f in files if os.path.isfile(f)]
 
# Loop to print the filenames
for filename in files:
    print(filename)

fnmatch()関数は、ファイル名とマッチさせるパターンの2つのパラメータを受け取ります。

上のコードでは、file` という単語を含むすべてのファイルを検索しています。

2. globライブラリの使用法

前にも述べたように、globの主な目的はファイル名のパターンマッチです。

./Documents/list_files1.py

結果は以下の通りです。

# Importing the pathlib library
import pathlib
 
# Creating a Path object
path = pathlib.Path('./Documents/')
 
# Extracting a list of files starting with 'm'
files = path.rglob('m*')
 
# Loop to print the files separately
for file in files:
    print(file)

上記のパターンマッチの正規表現 '**/*[0-9]*.*' は、以下のように説明することができる。

  • '**' – パス内のすべてのサブディレクトリを走査します。
  • '/*' – ファイル名は任意の文字で始めることができます。
  • '[0-9]' – ファイル名の中に数字が含まれる場合
  • '*.*' – ファイル名は、任意の文字で終わることができ、任意の拡張子を持つことができます。

3. pathlib’ ライブラリの使用

pathlibはファイルシステムと対話するためのオブジェクト指向の方法に従っています。

このライブラリに含まれるrglob()` 関数は、特定の Path オブジェクトを介してファイルのリストを再帰的に抽出するために使用されます。


これらのファイルのリストは rglob() 関数の中でパターンを使ってフィルタリングすることができます

Documents/my_program.cpp
Documents/Journaldev/mastermind.py

結果は以下の通りです。

# Importing the os and fnmatch library
import os, fnmatch
 
# The path for listing items
path = './Documents/'
 
# List to store filenames
file_list = []
 
"""
    Loop to extract python files
 
    path --> Name of each directory
    folders --> List of subdirectories inside current 'path'
    files --> List of files inside current 'path'
 
"""
print("List of python files in the directory:")
for path, folders, files in os.walk(path):
    for file in files:
        if fnmatch.fnmatch(file, '*.py'):
            file_list.append(os.path.join(path, file))
 
# Loop to print each filename separately
for filename in file_list:
    print(filename)

上のコードは、'm' という文字で始まるすべてのファイルをリストアップするために使われます。

特定の拡張子を持つディレクトリ内のファイルを一覧表示する

Pythonで特定の拡張子を持つファイルをリストアップすることは、パターンマッチングにいくらか似ています。

この目的のために、ファイルの拡張子に関するパターンを作成する必要があります。

List of python files in the directory:
./Documents/game_file.py
./Documents/hi-lo_pygame.py
./Documents/list_files1.py
./Documents/test.py
./Documents/list_files.py
./Documents/Journaldev/mastermind.py
./Documents/Journaldev/blackjack_terminal.py
./Documents/Journaldev/blackjack_pygame.py

を出力します。

List Files Python Ls
List Items using ‘ls’ command

fnmatch()関数は‘.py’で終わるファイル、つまり Python ファイルをフィルタリングして取り出します。

もし、異なる拡張子のファイルを取り出したい場合は、この部分を変更する必要があります。

例えば、C++のファイルだけを取り出すには、’.cpp’`を使用しなければなりません。

以上,Pythonでディレクトリ内のファイル一覧を取得する方法についてまとめました.

まとめ

どんな問題でも解決する方法は複数あり、最も便利なものが常に答えとは限りません。

この記事に関しては、Pythonプログラマはディレクトリ内のファイルをリストアップできるすべての方法を知っておく必要があります。

この記事がわかりやすかったら幸いです。

ご質問やご提案がありましたら、お気軽に下記へコメントください。

タイトルとURLをコピーしました