2016-11-24 11 views
0

私はtraverseDirというこの再帰関数に取り組んでいますが、ここまでうまくいっています。リストを反復処理してすべての要素に対してtraverseDir関数を呼び出す方法がわかりませんリスト内のあなたが助けることができれば、ありがとう!Pythonはリスト内のすべての要素に対して再帰関数を呼び出します

path = sys.argv[1] 

def traverseDir(path): 

    allFile = 0 
    someFile = 0 

    if os.path.isfile(path): # base case 
     print(sys.argv[0]) 
     allFile += 1 
     if path.endswith('.some'): 
      someFile += 1 

    else: 
     files = os.listdir(path) 
     return files 

     #if len(files[0]) <= 1: these 2 lines are where I can't figure out 
     # return traverseDir(item) 
+0

'lenを(ファイル[0])' 'リストfiles'をの最初の要素の長さです。それは達成しようとしていることですか? –

+0

あなたは 'os.walk'を書き直そうとしていますか? –

答えて

2

os.walkという組み込み関数が既にこれを行います。しかし、あなたの質問のために、あなたのfilesリストを繰り返し処理する必要があります。また、all_filessome_filesを再帰的に渡す必要があります。また、all_filessome_filesを返す必要があります(pythonではタプルとして複数の値を返すことができます)。次に、all_filessome_filesの再帰的に返された値を追加できます。

def traverseDir(path, all_files=0, some_files=0): 
    # ... your existing code 

    files = os.listdir(path) 
    for f in files: 
     # extend the path 
     full_path = os.path.join(path, f) 

     # unroll the returned values from the recursion 
     rec_all_files, rec_some_files = traverseDir(full_path, all_files, some_files) 
     # accumulate the values 
     all_files += rec_all_files 
     some_files += rec_some_files 

    return all_files, some_files 

これが記載されているすべてのファイルにtraverseDir()を呼び出します。その再帰呼び出しは、リストされたすべてのファイルに対してtraverseDir()を呼び出します。

+1

再帰呼び出しで 'path'を拡張するために必要な' os.path.join(path、f) 'を忘れました。 –

+0

私は、この関数がすべての 'allFile'と' someFile'の合計を返すことを意図していると仮定しています。 – zondo

+0

@zondoが 'all_files'と' some_files'を返すように更新されました – Soviut

0

os.listdir

import sys 
import os 

path = sys.argv[1] 


def traverseDir(path): 
    allFile = 0 
    someFile = 0 
    if os.path.isfile(path): 
     allFile += 1 
     if path.endswith('.some'): 
      someFile += 1 
    else: 
     for file in os.listdir(path): 
      agAllFile, agSomeFile = traverseDir(os.path.join(path, file)) 
      allFile += agAllFile 
      someFile += agSomeFile 
    return allFile, someFile 

print traverseDir(path) 

os.walk

import sys 
import os 

path = sys.argv[1] 


def traverseDir(path): 
    files = [file for dirFiles in os.walk(path) for file in dirFiles[2]] 
    return len(files), len([file for file in files if file.endswith('.some')]) 

print traverseDir(path) 
+0

'os.listdir'はbasenameだけを返します。それぞれのファイル名の前にパスを追加する必要があります。 'files'を' map(lambda f:os.path.join(path、f)、files) 'と置き換えます。 –

+0

ありがとう。あなたが正しい。 –

+0

この関数は、allFilesとsomeFilesの合計を返します。ここで合計を返すことはできますか? – Yolanda

関連する問題