2016-11-24 62 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

您在递归调用中忘了需要'os.path.join(path,f)'来扩展'path'。 –

+0

我假设这个函数是为了返回所有'allFile's和'someFile's的总和,所以应该有一点点。 – 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'只返回基名。你需要预先指定每个文件名的路径:用'map'替换'files'(lambda f:os.path.join(path,f),files)' –

+0

谢谢。你是对的。 –

+0

这个函数是为了返回所有的所有文件和一些文件的总数......你能在这里返回总数吗? – Yolanda

相关问题