2010-10-07 65 views

Trả lời

27

Để đếm các tệp và thư mục không theo đệ quy, bạn có thể sử dụng os.listdir và mất thời lượng.

Để đếm tập tin và thư mục đệ quy, bạn có thể sử dụng os.walk để lặp qua các tệp và thư mục con trong thư mục.

Nếu bạn chỉ muốn đếm các file không thư mục bạn có thể sử dụng os.listdiros.path.file để kiểm tra xem mỗi mục là một tập tin:

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

Hoặc cách khác sử dụng một máy phát điện:

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

Hoặc bạn có thể sử dụng os.walk như sau:

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

Tôi đã tìm thấy một số ý tưởng này từ this thread.

6

Bạn có thể sử dụng glob mô-đun:

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

Hoặc, như Mark Byers gợi ý trong câu trả lời của mình, nếu bạn chỉ muốn tập tin:

>>> 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

Nên nói rằng 'os.listdir ('. ')' Bao gồm các tập tin ẩn (bắt đầu với một dấu chấm duy nhất), trong khi 'glob (' ./* ') 'thì không. – lunaryorn

+0

@lunaryorn - Nếu bạn muốn các tệp ẩn trong thư mục hiện tại, hãy sử dụng 'glob ('. *')'. Nếu bạn muốn tất cả mọi thứ bao gồm các tập tin ẩn, sử dụng 'glob ('. *') + Glob ('*')'. – bstpierre

5

câu trả lời Đánh dấu Byer là đơn giản, thanh lịch, và đi cùng với tinh thần python.

Có sự cố, tuy nhiên: nếu bạn cố gắng chạy thư mục đó cho bất kỳ thư mục nào khác ".", Nó sẽ thất bại, vì os.listdir() trả về tên của tệp chứ không phải đường dẫn đầy đủ. Cả hai đều giống nhau khi liệt kê thư mục làm việc hiện tại, do đó lỗi sẽ không bị phát hiện trong nguồn ở trên.

Ví dụ: nếu bạn ở "/ home/me" và bạn liệt kê "/ tmp", bạn sẽ nhận được (nói) ['flashXVA67']. Bạn sẽ thử nghiệm "/ home/me/flashXVA67" thay vì "/ tmp/flashXVA67" bằng phương pháp ở trên.

Bạn có thể sửa lỗi này bằng os.path.join(), như thế này:

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

Ngoài ra, nếu bạn đang đi để được làm điều này đếm rất nhiều và yêu cầu thực hiện, bạn có thể muốn làm nó mà không tạo danh sách bổ sung. Dưới đây là một, unpythonesque giải pháp ít thanh lịch nhưng hiệu quả:

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

xem câu trả lời của bstpierre. – SilentGhost

+0

Thật vậy! Trông tốt hơn của tôi, và nếu bạn đang đọc điều này, hãy kiểm tra lại câu trả lời đầu tiên, một sự bổ sung được Mark thực hiện bằng cách sử dụng walk() để giải quyết cả hai vấn đề tôi đã chỉ ra trong một dòng. – slezica

+0

+1 để phát hiện lỗi - Tôi đã cập nhật câu trả lời của mình với phiên bản đã sửa. –

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

HOẶC

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

pathlib, đó là mới trong v 3.4, làm như dễ dàng hơn.. Dòng có gắn nhãn tạo danh sách không đệ quy của thư mục hiện tại, một danh sách có nhãn danh sách đệ quy.

from pathlib import Path 

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

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

Còn nhiều tính năng khác nữa.Với những dòng bổ sung này, bạn có thể thấy cả tên tệp tuyệt đối và tương đối cho các mục đó tệp.

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

Kết quả:

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 
Các vấn đề liên quan