Python 再帰的にディレクトリを探索する「os.walk」そして、正規表現「re」で特定のファイルに対して処理する

# '20/02/29更新:コードを見易く刷新しました。
 本プログラムは、カレントディレクトリ以下のサブディレクトリ内を含む全てのファイルを再帰的に検索する。もしcsvファイルがあればその中身をすべてリストへ格納して、All_data.csvというひとつのファイルに追記してゆく仕様です。

▼本プログラム

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys
import csv
import re

def findCsv(): # カレントディレクトリ以下全て探索の関数
    csvlist = []
    dirlist = []
    pathlist = []
    for dirpath, dirnames, filenames in os.walk(os.getcwd()):
        # コメントアウトする場合は、インデントに注意。
        # 複数行をまとめてコメントアウトする場合は「'」もしくは「"」で3つで囲む。
        '''
        print (dirpath)
        print (dirnames)
        print (filenames)
        '''
        for i, filename in enumerate(filenames):
            m = re.search(".csv", filename) # 拡張子csvファイルを抽出する場合
            if m:                        # mが真の場合に実行する。
                csvlist.append(filename) # appendメソッドで、csvlistのリストにファイル名を追記。
                dirlist.append(dirpath) # ディレクトリパスも、dirlistのリストに追記。
                mypath = [dirpath, filename]
                pathlist.append(os.path.join(*mypath))
    
    return pathlist

def readFile(csvPath): # ファイルをcsv.readerでリストで読み込む
    datalist = []
    with open(csvPath, 'r') as f1:
        reader = csv.reader(f1)
        for row in reader:
            datalist.append(row)

    return datalist

def writeFile(datalist): # ファイルをcsv.writerで書き込む
    with open('All_data.csv', 'a') as f2: # 'a'は追記の意味。上書きの場合は'w'
        writer = csv.writer(f2, delimiter=',', lineterminator="\n")
        for row in datalist:
            writer.writerow(row)

def main():
    # csvファイルパスをリストで取得
    pathlist = findCsv()
    for i, csvpath in enumerate(pathlist):
        print(i,'/',len(pathlist))
        datalist = readFile(csvpath) # ファイルをcsv.readerでリストで読み込む
        writeFile(datalist) # ファイルをcsv.writerで書き込む

if __name__ == '__main__': # このファイルを本体として実行した場合、mainが実行される。
    main()
    

正規表現を用いてファイルを抽出する方法は下記リンク参照

hk29.hatenablog.jp

以上