2010-10-07 200 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 
相關問題