for循环python的递归函数

时间:2014-06-05 20:43:14

标签: python file for-loop recursion

我有一个问题,不应该太难,但长期以来一直困扰着我 我正在尝试编写一个函数,在具有不同文件夹的目录中搜索具有扩展名jpg且大小大于0的所有文件。 然后应该打印这些类别中文件大小的总和。

我现在正在做的是

def myFuntion(myPath, fileSize): 

    for myfile in glob.glob(myPath): 
        if os.path.isdir(myFile):
            myFunction(myFile, fileSize)

        if (fnmatch.fnmatch(myFile, '*.jpg')):
            if (os.path.getsize(myFile) >  1):
                fileSize = fileSize + os.path.getsize(myFile)


    print "totalSize: " + str(fileSize)

这不能给我正确的结果。它将一个目录的文件大小相加,但不会对其余目录进行求和。例如,如果我有这些路径

C:/trial/trial1/trial11/pic.jpg  

C:/trial/trial1/trial11/pic1.jpg  

C:/trial/trial1/trial11/pic2.jpg  

C:/trial/trial2/trial11/pic.jpg  

C:/trial/trial2/trial11/pic1.jpg  

C:/trial/trial2/trial11/pic2.jpg  

我会得到前三个的总和以及最后三个的大小,但如果这有意义,我将不会得到6个的大小。

2 个答案:

答案 0 :(得分:1)

你忽略了递归调用的结果;调用之间不共享fileSize

不是将fileSize传递给递归调用,而是将返回的大小相加:

def myFunction(myPath): 
    fileSize = 0

    for myfile in glob.glob(myPath): 
        if os.path.isdir(myFile):
            fileSize += myFunction(myFile)

        if fnmatch.fnmatch(myFile, '*.jpg'):
            fileSize += os.path.getsize(myFile)


    return fileSize

然后打印最外面调用返回的最终总数:

print myFunction('C:/trial/')

答案 1 :(得分:1)

您应该使用os.walk()来解决此问题。

我就是这样做的 -

import os
import sys

def get_file_size(path, extensions):
    size = 0

    for root, dirs, files in os.walk(path):
        for file in files:
            if (file.lower().endswith(extensions)):
                size += os.path.getsize(os.path.join(root, file))

    return size

print(get_file_size('.', ('jpg', 'jpeg')))