Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでディレクトリとファイルを一覧表示する方法を徹底解説

Pythonには、指定したパス内のファイルやディレクトリを一覧表示するための方法がいくつかあります。この記事では、osモジュールを使った基本的な方法から、条件に応じた絞り込み、再帰的な探索まで、実用的なテクニックをわかりやすく解説します。

os.listdir()でファイルとディレクトリの一覧を取得する

特定のパスにあるすべてのファイルやディレクトリを取得する最も簡単な方法のひとつが、os.listdir()メソッドを使うことです。

import os
for x in os.listdir('.'):
    print(x)

実行結果

.pytest_cache
4forces.json
annotation1.py
asyncWrite.txt
attribute_access.py
background_process.py
……

上記のコードは、カレントワーキングディレクトリ内のファイルとディレクトリの一覧を表示しています。特定のディレクトリから一覧を取得したい場合は、絶対パスを引数として渡すだけでOKです。

import os
for x in os.listdir(r'C:\Python\Python361\selenium'):
    print(x)

実行結果

geckodriver.log
test1.py
webdriver

出力結果は実際のフォルダ階層と一致します。

ファイルかディレクトリかを判別する

os.listdir()の出力だけでは、各エントリがファイルなのか、ディレクトリなのか、あるいはリンクなのかを判別できません。エントリの種類を確認したい場合は、os.path.isfile()などの関数が便利です。

import os
for x in os.listdir('.'):
    if os.path.isfile(x): print('file-', x)
    elif os.path.isdir(x): print('directory-', x)
    elif os.path.islink(x): print('link-', x)
    else: print('---', x)

実行結果

directory- .pytest_cache
file- 4forces.json
file- annotation1.py
file- asyncWrite.txt
file- attribute_access.py
directory- build
directory- dist
directory- django
file- dynamic_array_implementation.py

filter()を使ったワンライナー

filter()を使えば、特定のパスからファイルだけを収集する処理を1行で書くことができます。

list(filter(lambda x: os.path.isfile(x), os.listdir('.')))

同様に、ディレクトリだけを抽出したい場合は次のようにします。

list(filter(lambda x: os.path.isdir(x), os.listdir('.')))

実行結果

['.pytest_cache', 'build', 'dist', 'django', 'DLLs', 'Doc', 'etc', 'gmplot', 'include', 'Lib', 'libs', 'Scripts', 'selenium', 'share', 'tcl', 'Tools', '__pycache__']

特定の種類のファイルを見つける

次のワンライナーは、ディレクトリ内のテキストファイル(.txt)を検索する例です。なお、この方法はサブディレクトリを再帰的にたどらず、指定したディレクトリ直下のマッチするエントリのみを返す点に注意してください。

list(filter(lambda x: x.endswith('.txt'), os.listdir('.')))

実行結果

['asyncWrite.txt', 'datafile.txt', 'exercise.txt', 'finally.txt', 'LICENSE.txt', 'NEWS.txt', 'out.txt', 'test.txt', 'test1.txt', 'test2.txt']

同じ処理は、リスト内包表記を使っても書けます。

>>> list(x for x in os.listdir('.') if x.endswith('.txt'))
['asyncWrite.txt', 'datafile.txt', 'exercise.txt', 'finally.txt', 'LICENSE.txt', 'NEWS.txt', 'out.txt', 'test.txt', 'test1.txt', 'test2.txt']

また、正規表現を使った方法もあります。複数の拡張子をまとめて指定できるのが利点です。

import re
fx = re.compile(r'\.(txt|py)')
print(list(filter(fx.search, os.listdir('.'))))

このコードを実行すると、拡張子が .txt または .py のファイルが一括してリストアップされます。

os.walk()で再帰的に探索する

サブディレクトリまで含めてすべてのファイルを取得したい場合は、os.walk()メソッドが便利です。os.walk()は、ディレクトリツリー内のファイル名をトップダウンで順番に生成します。

import os
for root, dirs, files in os.walk(r'C:\Python\Python361\selenium'):
    for filename in files:
        print(filename)

実行結果

geckodriver.log
test1.py
x_ignore_nofocus.so
getAttribute.js
isDisplayed.js

rootには現在走査中のディレクトリのパス、dirsにはその配下のサブディレクトリ、filesにはその配下のファイル名のリストが格納されるため、階層構造ごと柔軟に処理できます。大量のファイルを扱うバッチ処理や、プロジェクト全体のファイル検索などに活用してみてください。

  1. Pythonのuuencodeモジュールでファイルをエンコード・デコードする方法

    ファイル転送の際には、暗号化や圧縮、あるいは異なるOSやファイル読み込みプログラムでの処理に対応するなど、さまざまな理由からファイルのエンコード・デコードが必要になることがよくあります。Python標準ライブラリのuuモジュールを使えば、こうしたエンコードとデコードを簡単に行うことができます。ファイルのエンコードここでは、以下の画像ファイルを使用して、エンコードを行い、その後デコードして元の画像を復元してみます。次のプログラムでは、encode関数を使って指定した画像をエンコードし、エンコード後のファイル内容を読み出して表示しています。サンプルコードimport uu infile = &q

  2. Linuxのlsコマンド徹底解説!ファイルとディレクトリを一覧表示する方法

    Linuxのlsコマンドは、多くのユーザーが最初に使うことになる基本コマンドの一つです。この記事では、lsコマンドの基本的な使い方と、実務で頻繁に利用されるオプションについてわかりやすく解説します。 筆者が普段よく使うオプションの組み合わせは以下のとおりです。 ls -Zaltrh それでは、各オプションの意味をひとつずつ掘り下げながら、この組み合わせがなぜ便利なのかを説明していきます。 lsコマンドの基本構文 # ls [OPTION] [FILE] OPTIONS: [-a] 「.」または「..」で始まる隠しエントリを無視しない [-h] -lと併用した場合、サイズを人間が読みやすい形式で