2017-03-10 7 views
3

いくつかの基本コードを使ってフォルダを読み込んで、フォルダ内のファイル数を教えてください。それは不良によるフォルダ/ファイル管理にファイルの長い、ジャンキーリストを返すことができるよう、「メイン」フォルダ内に複数のフォルダがあるまでpython os.walk to특정レベル

import os 

folders = ['Y:\\path1', 'Y:\\path2', 'Y:\\path3'] 
for stuff in folders: 
    for root, dirs, files in os.walk(stuff, topdown=True): 
     print("there are", len(files), "files in", root) 

これは素晴らしい作品:ここに は、私は現在、それを行う方法です。だから私は多くても第二レベルに行きたい。例:

Main Folder 
---file_i_want 
---file_i_want 
---Sub_Folder 
------file_i_want <--* 
------file_i want <--* 
------Sub_Folder_2 
---------file_i_dont_want 
---------file_i_dont_want 

私はbreakとし、this postalso this postから取らdel dirs[:]でのみ最初のレベルに行くために方法を知っています。

import os 
import pandas as pd 

folders = ['Y:\\path1', 'Y:\\path2', 'Y:\\path3'] 
for stuff in folders: 
    for root, dirs, files in os.walk(stuff, topdown=True): 
     print("there are", len(files), "files in", root) 
     del dirs[:] # or a break here. does the same thing. 

しかし、私の検索に関係なく、2つのレイヤーを深くする方法を見つけることはできません。私は他の投稿を理解していないかもしれませんか?私はdel dirs[:2]のようなものを考えていたが、役に立たなかった。誰かが私を案内したり、これを達成するために私に説明することができますか?あなたは、このように行うことができ

+0

'dirs'は現在のディレクトリ内のすべてのディレクトリですが、フォルダツリーの深さではありません。 –

+0

@PeterWood、ああ!それは理にかなっている。だから私はなぜ 'del dirs [:2]'が愚かなのか理解しています... – MattR

+0

あなたはPython 3を使っているようです。 –

答えて

5

for root,dirs,files in os.walk(stuff): 
    if root[len(stuff)+1:].count(os.sep)<2: 
     for f in files: 
      print(os.path.join(root,f)) 

キーは次のとおりです。if root[len(stuff)+1:].count(os.sep)<2

それはrootからstuff +セパレーターを削除し、その結果がstuffに相対的です。ファイル区切り文字の数を数えて、0または1の区切り記号がなければ条件を入力しないでください。

もちろん、それは完全なファイル構造をスキャンしますが、それがうまく動作しない場合を除きます。

もう1つの解決策は、最大再帰レベルで再帰的に(ディレクトリチェックを使用して)を使用することですが、必要がない場合は少し面倒です。

def scanrec(root): 
    rval = [] 

    def do_scan(start_dir,output,depth=0): 
     for f in os.listdir(start_dir): 
      ff = os.path.join(start_dir,f) 
      if os.path.isdir(ff): 
       if depth<2: 
        do_scan(ff,output,depth+1) 
      else: 
       output.append(ff) 

    do_scan(root,rval,0) 
    return rval 

print(scanrec(stuff)) # prints the list of files not below 2 deep 

注:os.listdiros.path.isfileはそれほど最適ではない2つのstatの呼び出しを行うことはそんなに難しいことではありませんので、ここでは一つの実施です。 Python 3.5では、os.scandirを使用すると、ダブルコールを回避できます。

+0

これは私が欲しかったものです。 「Key is」というステートメントに本当に感謝しています。あなたがこの答えにどうやって来たのか、親切に説明したり、いくつかの文書を私に指摘したりすることができますか? – MattR

+0

'root [len(stuff)]が' {len(stuff)} 'のときになぜ '中断'しないのでしょうか? + 1:]。count(os.sep)> = 2'?トップダウンするとき、それが本当であれば、 'root'の他のすべての値に当てはまります。 –

+0

@DavidCullen良い点。それは実際には動作しませんが、それはディレクトリにのみ適用されるようです。 –

1

あなたはセパレータを数えることができる、それは二つのレベルが深いdirsの内容を削除するかどうそうwalkは深い再帰しません:行動について、次の

import os 

MAX_DEPTH = 2 
folders = ['Y:\\path1', 'Y:\\path2', 'Y:\\path3'] 
for stuff in folders: 
    for root, dirs, files in os.walk(stuff, topdown=True): 
     print("there are", len(files), "files in", root) 
     if root.count(os.sep) - stuff.count(os.sep) == MAX_DEPTH - 1: 
      del dirs[:] 

Python documentation状態:

トップダウンをがTrueの場合、呼び出し元はdirnamesリストを(おそらくdelまたはsliceの割り当てを使用して)変更することができ、walk()は名前がdirnamesのままであるサブディレクトリに再帰します。検索をプルーニングしたり、特定の訪問順序を指定したり、walk()を再開する前に呼び出し元が作成または名前を変更したディレクトリについてwalk()に通知することもできます。

foldersに存在する区切り文字を考慮する必要があることに注意してください。たとえば、y:\path1が歩いている場合、ルートはy:\pathですが、そこで再帰を停止する必要はありません。

+0

私はドキュメントを指してくれてありがとう! 'root.count(os.sep)'がルートの '' \\ ''を数えているのは正しいですか? – MattR

+1

@MattR:最初のフォルダにある区切り文字を引く必要があるルートから、\(または、特定の区切り文字が何であれ)を数えています。 – niemmi

関連する問題