2010-10-07 113 views

回答

27

要非递归计数文件和目录,您可以使用os.listdir并取其长度。

要递归计算文件和目录,可以使用os.walk遍历目录中的文件和子目录。

如果您只想计算文件不是目录,你可以使用os.listdiros.path.file检查每个条目是一个文件:

import os.path 
path = '.' 
num_files = len([f for f in os.listdir(path) 
       if os.path.isfile(os.path.join(path, f))]) 

或可选择地使用发电机:

num_files = sum(os.path.isfile(os.path.join(path, f)) for f in os.listdir(path)) 

或者你可以使用os.walk如下:

len(os.walk(path).next()[2]) 

我从this thread发现了其中的一些想法。

6

可以使用glob模块:

>>> import glob 
>>> print len(glob.glob('/tmp/*')) 
10 

或者,正如马克拜尔斯建议在他的回答,如果你只想文件:

>>> print [f for f in glob.glob('/tmp/*') if os.path.isfile(f)] 
['/tmp/foo'] 
>>> print sum(os.path.isfile(f) for f in glob.glob('/tmp/*')) 
1 
+0

应该说,即'os.listdir(”。 ')'包括隐藏文件(从一个点),而'水珠(' ./* ')'不。 – lunaryorn 2010-10-07 17:23:46

+0

@lunaryorn - 如果你想在当前目录下隐藏文件,使用'glob('。*')'。如果你想要一切包括隐藏文件,使用'glob('。*')+ glob('*')'。 – bstpierre 2010-10-07 19:16:21

5

马克·拜尔的答案很简单,优雅,伴随着蟒蛇精神。

有一个问题,但是:“”如果你试图运行任何其他的目录下,它会失败,因为os.listdir()返回的文件,而不是完整路径的名称。列出当前工作目录时,这两者是相同的,所以错误在上面的源代码中未被发现。例如,如果你在“/ home/me”并列出“/ tmp”,你会得到(比如说)['flashXVA67']。您将使用上述方法测试“/ home/me/flashXVA67”而不是“/ tmp/flashXVA67”。

可以使用os.path.join()解决这一问题,像这样:同样

import os.path 
path = './whatever' 
count = len([f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]) 

,如果你打算做这个数很多,需要的性能,你可能想要做它不会产生额外的清单。这里有一个不太优雅,但unpythonesque有效的解决方案:

import os 

def fcount(path): 
    """ Counts the number of files in a directory """ 
    count = 0 
    for f in os.listdir(path): 
     if os.path.isfile(os.path.join(path, f)): 
      count += 1 

    return count 


# The following line prints the number of files in the current directory: 
path = "./whatever" 
print fcount(path) 
+0

看看bstpierre的回答。 – SilentGhost 2010-10-07 16:51:08

+0

确实!看起来比我的好,如果你正在阅读这篇文章,请回头看看第一个答案,Mark用walk()做了一个补充,解决了我在一行中指出的两个问题。 – slezica 2010-10-07 17:05:43

+0

+1发现错误 - 我更新了我的答案和更正后的版本。 – 2010-10-08 03:28:18

0
total = len(filter(
      lambda f: os.path.isfile(os.path.join(path_to_dir, f)), 
      os.listdir(path_to_dir))) 

OR

total = sum([True for f in os.listdir(path_to_dir) if os.path.isfile(os.path.join([path_to_dir, f)]) 
0

pathlib,在v是新的3.4,使得像容易。标记为的行生成当前文件夹的非递归列表,该递归列表标记为的递归列表。

from pathlib import Path 

import os 
os.chdir('c:/utilities') 

print (len(list(Path('.').glob('*')))) ## 1 
print (len(list(Path('.').glob('**/*')))) ## 2 

还有更多的好东西。有了这些额外的行,您可以看到文件为文件的那些项目的绝对文件名和相对文件名。

for item in Path('.').glob('*'): 
    if item.is_file(): 
     print (str(item), str(item.absolute())) 

结果:

boxee.py c:\utilities\boxee.py 
boxee_user_catalog.sqlite c:\utilities\boxee_user_catalog.sqlite 
find RSS.py c:\utilities\find RSS.py 
MyVideos34.sqlite c:\utilities\MyVideos34.sqlite 
newsletter-1 c:\utilities\newsletter-1 
notes.txt c:\utilities\notes.txt 
README c:\utilities\README 
saveHighlighted.ahk c:\utilities\saveHighlighted.ahk 
saveHighlighted.ahk.bak c:\utilities\saveHighlighted.ahk.bak 
temp.htm c:\utilities\temp.htm 
to_csv.py c:\utilities\to_csv.py 
相关问题