web-dev-qa-db-ja.com

フォルダー、サブフォルダーを繰り返し処理し、テキストファイルへのパスを含むファイル名を出力します

pythonを使用して、他のソフトウェアをバッチで実行するために必要なファイルを作成しようとしています。このため、必要なデータファイルをソフトウェアにロードするテキストファイルを作成する必要があります。問題は、このテキストファイルに入力する必要があるファイルが、一連の構造化フォルダーに格納されていることです。

一連のフォルダー(最大20)をループする必要があります。各フォルダーには、必要なファイルを含む最大3つのフォルダーを含めることができます。フォルダーの最下位レベルには、ソフトウェアの実行ごとに必要なファイルのセットが含まれています。テキストファイルには、これらのファイルのパスと名前が1行ずつ印刷され、命令行が追加され、すべてのサブレベルフォルダーがチェックされるまで、フォルダーから次のファイルセットに移動する必要があります。

18
manish449

Os.walk()を使用します。以下は、「dir」のサブディレクトリ内のすべてのファイルのリストを出力します。結果は、ニーズに合わせて操作できます。

import os                                                                                                             

def list_files(dir):                                                                                                  
    r = []                                                                                                            
    subdirs = [x[0] for x in os.walk(dir)]                                                                            
    for subdir in subdirs:                                                                                            
        files = os.walk(subdir).next()[2]                                                                             
        if (len(files) > 0):                                                                                          
            for file in files:                                                                                        
                r.append(subdir + "/" + file)                                                                         
    return r                                                                                                          
18

チャールズの答えは良いですが、速度と効率を高めるために改善することができます。 os.walk()によって生成される各アイテムは、3つのアイテムのタプルです。それらのアイテムは次のとおりです。

  1. 作業ディレクトリ
  2. 作業ディレクトリに存在するサブディレクトリを命名する文字列のリスト
  3. 作業ディレクトリに存在するファイルのリスト

これを知って、Charlesのコードの多くはforloopの修正で凝縮できます:

import os

def list_files(dir):
    r = []
    for root, dirs, files in os.walk(dir):
        for name in files:
            r.append(os.path.join(root, name))
    return r
43
L. Teder