Python对列表中的每个元素调用递归函数

Python对列表中的每个元素调用递归函数,python,recursion,Python,Recursion,我正在研究一个名为traverseDir的递归函数,在这里之前一切都进行得很顺利,我不知道如何遍历列表并对列表中的每个元素调用我的traverseDir函数。如果你能帮忙,非常感谢 path = sys.argv[1] def traverseDir(path): allFile = 0 someFile = 0 if os.path.isfile(path): # base case print(sys.argv[0]) allFi

我正在研究一个名为traverseDir的递归函数,在这里之前一切都进行得很顺利,我不知道如何遍历列表并对列表中的每个元素调用我的traverseDir函数。如果你能帮忙,非常感谢

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)
path=sys.argv[1]
def traverseDir(路径):
allFile=0
someFile=0
如果os.path.isfile(路径):#基本情况
打印(sys.argv[0])
allFile+=1
如果path.endswith('.some'):
someFile+=1
其他:
files=os.listdir(路径)
返回文件

#如果len(files[0])调用的内置函数已执行此操作。但是,为了回答您的问题,您需要遍历
文件
列表。您还需要通过递归向下传递
所有_文件
一些_文件
,以便它们可以在运行时累积。您还需要返回
所有_文件
一些_文件
(python允许您以元组的形式返回多个值)。然后可以为
所有\u文件
一些\u文件
添加递归返回的值

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()

调用的内置函数已经完成了这项工作。但是,为了回答您的问题,您需要遍历
文件
列表。您还需要通过递归向下传递
所有_文件
一些_文件
,以便它们可以在运行时累积。您还需要返回
所有_文件
一些_文件
(python允许您以元组的形式返回多个值)。然后可以为
所有\u文件
一些\u文件
添加递归返回的值

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()

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)

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)

len(文件[0])
列表文件中第一个元素的长度。这就是您试图实现的吗?您正在尝试重写操作系统。walk
len(文件[0])
列表文件中第一个元素的长度。这就是您试图实现的吗?您试图重写
os.walk
?您忘记了在递归调用中扩展
path
所需的
os.path.join(path,f)
。我假设此函数旨在返回所有
allFile
someFile
的总和,所以应该有更多的内容。@zondo更新为包含返回
所有\u文件
一些\u文件
@Soviut感谢您的帮助,现在在我的终端中有一个--TypeError:“NoneType”对象不可编辑。。关于最长的行,这是因为您可能没有从
os.listdir()
获取文件列表。检查输出并在必要时使用if语句应用筛选。您忘记了在递归调用中扩展
path
所需的
os.path.join(path,f)
。我假设此函数旨在返回所有
allFile
s和
someFile
s的总和,所以应该有更多的内容。@zondo更新为包含返回
所有\u文件
一些\u文件
@Soviut感谢您的帮助,现在在我的终端中有一个--TypeError:“NoneType”对象不可编辑。。关于最长的行,这是因为您可能没有从
os.listdir()
获取文件列表。检查输出并在必要时使用if语句应用筛选。
os.listdir
仅返回基本名称。您需要预先设置每个文件名的路径:用say
map(lambda f:os.path.join(path,f),files)替换
files
此函数用于返回所有文件和某些文件的总数。。。您能在这里返回总数吗?
os.listdir
只返回基本名称。您需要预先设置每个文件名的路径:用say
map(lambda f:os.path.join(path,f),files)替换
files
此函数用于返回所有文件和某些文件的总数。。。你能把总数还给我吗?