递归搜索具有特定扩展名的文件

时间:2015-07-02 16:59:11

标签: python recursion

我试图用路径计算以特定扩展名(用户将通过)结束的所有文件。我们也有子文件夹,因此搜索必须是递归的。 下面是我正在尝试,但它正在抛出错误。请说明差距在哪里。 如果我删除if file.endswith(extension):行,则它会提供所有文件的计数(包括所有扩展名的文件)

import os, sys

def fileCount(path, extension):
    count = 0
    for root, dirs, file in os.walk(path):
        if file.endswith(extension):
            count += len(file)
    return count

print fileCount('/home/export/JobDefinition', '.car')

以下是输出:

$ python test.py
Traceback (most recent call last):
  File "test.py", line 11, in <module>
    print fileCount('/home/export/JobDefinition', '.car')
  File "test.py", line 6, in fileCount
    if file.endswith(extension):
AttributeError: 'list' object has no attribute 'endswith'

5 个答案:

答案 0 :(得分:2)

您希望在过滤所有文件后得到总和:

def fileCount(path, extension):
    count = 0
    for root, dirs, files in os.walk(path):
        count += sum(f.endswith(extension) for f in files)
    return count

files会返回一个文件列表,因此sum(f.endswith(extension) for f in files)将为您提供以给定扩展名结尾的所有文件的计数。

或者只返回所有的总和:

def fileCount(path, extension):
  return sum(f.endswith(extension) for root, dirs, files in os.walk(path) for f in files)

答案 1 :(得分:1)

os.walk()用于遍历文件 S

您必须循环浏览 S 文件,该文件以list的形式返回。

def fileCount(path, extension):
    count = 0
    for root, dirs, files in os.walk(path):
        for file in files:
            if file.endswith(extension):
                count += 1
    return count

答案 2 :(得分:1)

os.walk()会返回一个像 - (dirpath, dirnames, filenames)这样的元组。其中filenames是目录中所有文件的列表,其中为list

您需要迭代文件,而不是使用file.endswith

示例 -

import os, sys

def fileCount(path, extension):
    count = 0
    for root, dirs, files in os.walk(path):
        for file in files:
            if file.endswith(extension):
                count += 1
    return count

print fileCount('/home/export/JobDefinition', '.car')

答案 3 :(得分:1)

这是一个单线替代方案:

import os

def fileCount(path, extension):
    return sum([1 for root, dirs, files in os.walk(path) for file in files if file.endswith(extension)])

print fileCount('/home/export/JobDefinition', '.car')

答案 4 :(得分:0)

formatDateFunctionPointer.call(ejsScope, ...);的第三个返回值是文件名列表。