Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

pythonで任意のディレクトリ以下の全てのファイルを処理する(追記あり)

More than 3 years have passed since last update.

はじめに

pythonを使ってあるディレクトリ以下の全てのファイルを処理することがあったので、その方法をまとめます。

全てのファイルにアクセスする方法

基本的には、ディレクトリを探索して中のファイルを調べて、ファイルだったら処理、ディレクトリだったらさらに探索、というのを再帰的に繰り返します。

import os
ROOT_PATH = 'ルートディレクトリ'


def prcess(file_path):
    # 処理を記述


def recursive_file_check(path):
    if os.path.isdir(path):
        # directoryだったら中のファイルに対して再帰的にこの関数を実行
        files = os.listdir(path)
        for file in files:
            recursive_file_check(path + "\\" + file)
    else:
        # fileだったら処理
        process(path)


recursive_file_check(ROOT_PATH)

特定のファイル形式のファイルのみ処理したいとき

else:ブロックを通過するときにif文でfilterを通してあげれば実装できます。後ろの文字から拡張子をするのが楽だと思います。

例えばエクセル形式のファイルのみを処理したいときは、

    else:
        if path[-4:] == '.xls' or path[-5:] == '.xlsx':
            process(path)

などとすれば、エクセルファイルだったときのみ処理をすることができます。

追記

わざわざ再帰検索をせずとも、ディレクトリ下の全てを出してくれる関数os.walkを使うともっと楽にかけます。

def file_check(path):
    for pathname, dirnames, filenames in os.walk(path):
        for filename in filenames:
             process(os.path.join(pathname,filename)

とてもすっきりしました!

フィルターに関しても、endswith関数を使えばわざわざスライスせずとも簡単に調べることができます。上と同様の例は、次のようになります。

def simple_check(path):
    for pathname, dirnames, filenames in os.walk(path):
        for filename in filenames:
             # フィルタ処理
             if filename.endswith('.xls') or filename.endswith('.xlsx'):
                    check(os.path.join(pathname,filename)
hasepy
androidエンジニア 得意なのはandroidですがフロント(Vueなど)からサーバ(Goなど)まで割となんでもやってます
flutter-lab
flutter に関する tips を投稿していきます
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away