2015-07-02 127 views
0

我正在试图获取以特定扩展名(哪个用户将通过)与路径结尾的所有文件的计数。我们也有子文件夹,因此搜索必须递归。 下面是我正在尝试,但它是抛出错误。请建议差距在哪里。 如果删除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' 

回答

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

优秀的答案,并一如既往非常优雅...你也可以使用'len'(但我喜欢总和解决方案:P) –

+0

我把它归结为一行;) – heinst

+1

@JoranBeasley,谢谢,yep len会工作正常,但gen exp避免了需要建立一个列表,除非列表很大,否则可能没有真正的区别。 –

1

os.walk()用于迭代。

您必须遍历文件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 
+0

我已经尝试这样做,它给了我3333作为计数是办法不多。我想这是给我所有文件的所有字符数。 – ankitpandey

+0

@ankitpandey我编辑了我的答案:也许你应该使用'count + = 1'来代替,这似乎是合乎逻辑的。 – Delgan

1

os.walk()返回一个元组,如 - (dirpath, dirnames, filenames)。其中filenames是目录中所有文件的列表,其a 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') 
+0

我已经试过这个,它给了我3333作为计数,这是很多的方式。我想这是给我所有文件的所有字符数。 – ankitpandey

+0

编辑答案后,我们需要添加'1'来计算每个带扩展名的文件,而不是'len(files)'。 –

0

os.walk第三返回值是文件名的列表。

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') 
+1

我不认为这是相当你想要的.. 。我怀疑你会得到比你想象的更大的值 –

+0

@JoranBeasley我对它的完整代码进行了测试,并返回相同的数字 – heinst

+0

是的,那是因为原始代码也是错误的......这是文件名字符串长度的总和匹配搜索(不匹配的数量) –

相关问题