この記事では、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)
|
見ての通り、各方法の出力は一致します。
この記事もチェック:Pythonのリストを標準出力する3つの簡単な方法
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'
が絶対パスではなく、カレントディレクトリからの相対パスであるため、上記のコードは他のディレクトリでは動作しないことです。
この記事もチェック:Pythonのsample関数を使ってリストからランダムに要素を抽出する方法
再帰的にディレクトリ内の全ファイルをリストアップする
あるディレクトリとそのサブディレクトリ内のファイルを表示するためには、それらを再帰的にたどる必要があります。
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のindex関数をリストや文字列の使い方を解説する
特定の拡張子を持つディレクトリ内のファイルを一覧表示する
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 |
を出力します。
fnmatch()関数は
‘.py’で終わるファイル、つまり Python ファイルをフィルタリングして取り出します。
もし、異なる拡張子のファイルを取り出したい場合は、この部分を変更する必要があります。
例えば、C++のファイルだけを取り出すには、’.cpp’`を使用しなければなりません。
以上,Pythonでディレクトリ内のファイル一覧を取得する方法についてまとめました.
まとめ
どんな問題でも解決する方法は複数あり、最も便利なものが常に答えとは限りません。
この記事に関しては、Pythonプログラマはディレクトリ内のファイルをリストアップできるすべての方法を知っておく必要があります。
この記事がわかりやすかったら幸いです。
ご質問やご提案がありましたら、お気軽に下記へコメントください。