Cách đếm số lượng tệp trong một thư mục bằng Python


224

Tôi cần đếm số lượng tệp trong một thư mục bằng Python.

Tôi đoán cách dễ nhất là len(glob.glob('*')), nhưng nó cũng tính chính thư mục đó là một tập tin.

Có cách nào để chỉ đếm các tập tin trong một thư mục?


Để thoát khỏi các thư mục, bạn có thể làm '* .fileextension' cho bất kỳ phần mở rộng tệp nào bạn đang tìm kiếm.

Câu trả lời:


275

os.listdir()sẽ hiệu quả hơn một chút so với sử dụng glob.glob. Để kiểm tra xem tên tệp có phải là tệp thông thường không (không phải là thư mục hoặc thực thể khác), hãy sử dụng os.path.isfile():

import os, os.path

# simple version for working with CWD
print len([name for name in os.listdir('.') if os.path.isfile(name)])

# path joining version for other paths
DIR = '/tmp'
print len([name for name in os.listdir(DIR) if os.path.isfile(os.path.join(DIR, name))])

14
Nhớ thêm folder_pathbên trong os.path.filename(name)nếu bạn không ở trên cwd. stackoverflow.com/questions/17893542/ Mạnh
Rafael Oliveira

1
Điều này không tính tập tin trong các thư mục lồng nhau.
codersofthedark

5
Đối với các tệp đếm đệ quy được lồng trong các thư mục, bạn có thể sử dụng giải pháp os.walk () tốt hơn.
Joel B

Lợi ích của việc sử dụng os.path.join(DIR, name)hơn là DIR + '/' + namegì? Cái sau ngắn hơn và, IMO, rõ ràng hơn cái trước. Có lẽ có một số hệ điều hành: es mà sau này sẽ thất bại?
HelloGoodbye

@Hellooodbye Đó chính xác là lý do.
ellockie

102
import os

path, dirs, files = next(os.walk("/usr/lib"))
file_count = len(files)

2
Đây không phải là đệ quy
Kyle Bridenstine

48

Đối với tất cả các loại tệp, thư mục con bao gồm:

import os

list = os.listdir(dir) # dir is your directory path
number_files = len(list)
print number_files

Chỉ các tệp (tránh thư mục con):

import os

onlyfiles = next(os.walk(dir))[2] #dir is your directory path as string
print len(onlyfiles)

Đây không phải là đệ quy
Kyle Bridenstine

32

Đây là nơi mà fnmatch rất tiện dụng:

import fnmatch

print len(fnmatch.filter(os.listdir(dirpath), '*.txt'))

Thêm chi tiết: http://docs.python.org/2/l Library / fnmatch.html


3
Việc này nhanh hơn nhiều (khoảng một nửa thời gian với thử nghiệm của tôi trên một thư mục có 10.000 tệp) nếu bạn biết mẫu bạn đang tìm, thay vào đó thử nghiệm từng tệp với os.path.isfile()câu trả lời được chấp nhận. Cũng nhanh hơn đáng kể glob.glob().
CivilFan

14

Nếu bạn muốn đếm tất cả các tệp trong thư mục - bao gồm các tệp trong thư mục con, cách thức pythonic nhất là:

import os

file_count = sum(len(files) for _, _, files in os.walk(r'C:\Dropbox'))
print(file_count)

Chúng tôi sử dụng tổng số nhanh hơn so với việc thêm rõ ràng số lượng tệp (thời gian chờ xử lý)


1
Xin chào, tôi đã cố gắng để hiểu mã này (mã hoạt động hoàn hảo), tôi biết chúng ta có thể sử dụng _trong một forvòng lặp. os.walktôi cũng biết Nhưng không chắc chắn những gì đang xảy ra với dấu gạch dưới bên trong sumchức năng, bạn có thể vui lòng giải thích. Cảm ơn!
Ejaz

1
Unsdercore chỉ là một tên biến @Ejaz, theo quy ước được sử dụng khi chúng ta bỏ qua biến - đó là những gì chúng ta làm ở đây - chúng ta gọi walk và chỉ đếm số lượng tệp trong mỗi thư mục, bỏ qua các giá trị gốc và
dir

12
import os
print len(os.listdir(os.getcwd()))

2
Điều này đôi khi có thể hữu ích nhưng nó cũng bao gồm các thư mục con trong số đếm
Brian Burns

10
def directory(path,extension):
  list_dir = []
  list_dir = os.listdir(path)
  count = 0
  for file in list_dir:
    if file.endswith(extension): # eg: '.txt'
      count += 1
  return count

10

Tôi ngạc nhiên khi không ai nhắc đến os.scandir:

def count_files(dir):
    return len([1 for x in list(os.scandir(dir)) if x.is_file()])

Hoạt động tuyệt vời với Python 3.6!
Aoki Ahishatsu

7

Điều này sử dụng os.listdirvà làm việc cho bất kỳ thư mục:

import os
directory = 'mydirpath'

number_of_files = len([item for item in os.listdir(directory) if os.path.isfile(os.path.join(directory, item))])

điều này có thể được đơn giản hóa với một trình tạo và thực hiện nhanh hơn một chút với:

import os
isfile = os.path.isfile
join = os.path.join

directory = 'mydirpath'
number_of_files = sum(1 for item in os.listdir(directory) if isfile(join(directory, item)))

5
def count_em(valid_path):
   x = 0
   for root, dirs, files in os.walk(valid_path):
       for f in files:
            x = x+1
print "There are", x, "files in this directory."
return x

Lấy từ bài đăng này


2
1. fileslà một danh sách. 2. OP không tìm kiếm số đệ quy
SilentGhost

4
import os

def count_files(in_directory):
    joiner= (in_directory + os.path.sep).__add__
    return sum(
        os.path.isfile(filename)
        for filename
        in map(joiner, os.listdir(in_directory))
    )

>>> count_files("/usr/lib")
1797
>>> len(os.listdir("/usr/lib"))
2049

4

Định dạng lại mã của Luke.

import os

print len(os.walk('/usr/lib').next()[2])

4

Đây là một lệnh đơn giản mà tôi thấy hữu ích:

print int(os.popen("ls | wc -l").read())

Phân tích cú pháp đầu ra lsthường được xem là khó chịu (nó thường có thể gây ra sự cố), mặc dù đây không phải là một phương pháp "nhanh và bẩn" xấu ở vỏ. ls -1Tuy nhiên, bạn nên sử dụng để đảm bảo một dòng trên mỗi tệp.
Bloodgain

3

Mặc dù tôi đồng ý với câu trả lời được cung cấp bởi @DanielStutzbach: os.listdir()sẽ hiệu quả hơn một chút so với sử dụng glob.glob.

Tuy nhiên, độ chính xác cao hơn, nếu bạn muốn đếm số lượng tệp cụ thể trong thư mục, bạn muốn sử dụng len(glob.glob()). Chẳng hạn, nếu bạn đếm tất cả các pdf trong một thư mục bạn muốn sử dụng:

pdfCounter = len(glob.glob1(myPath,"*.pdf"))

2

Nó đơn giản:

print(len([iq for iq in os.scandir('PATH')]))

nó chỉ đơn giản là đếm số lượng tập tin trong thư mục, tôi đã sử dụng kỹ thuật hiểu danh sách để lặp qua thư mục cụ thể trả lại tất cả các tập tin. "Len (danh sách trả về)" trả về số lượng tệp.


1
Chào mừng bạn đến với Stack Overflow. Chất lượng của câu trả lời này có thể được cải thiện bằng cách thêm một lời giải thích: Cách trả lời
Elletlar

1
Cảm ơn Elletlar, tôi đã chỉnh sửa câu trả lời của mình, tôi sẽ đảm bảo trả lời theo cách toàn diện hơn: D
Agha Saad

1
import os

total_con=os.listdir('<directory path>')

files=[]

for f_n in total_con:
   if os.path.isfile(f_n):
     files.append(f_n)


print len(files)

OP yêu cầu số lượng tệp , danh sách này cũng liệt kê các thư mục.
Korem

1

Nếu bạn sẽ sử dụng lớp vỏ tiêu chuẩn của hệ điều hành, bạn có thể nhận được kết quả nhanh hơn nhiều so với sử dụng cách thức pythonic thuần túy.

Ví dụ cho Windows:

import os
import subprocess

def get_num_files(path):
    cmd = 'DIR \"%s\" /A-D /B /S | FIND /C /V ""' % path
    return int(subprocess.check_output(cmd, shell=True))

1
Nhưng nó sẽ không thể di động được.
Politank-Z

1

Tôi tìm thấy một câu trả lời khác có thể đúng như câu trả lời được chấp nhận.

for root, dirs, files in os.walk(input_path):    
for name in files:
    if os.path.splitext(name)[1] == '.TXT' or os.path.splitext(name)[1] == '.txt':
        datafiles.append(os.path.join(root,name)) 


print len(files) 

0

Tôi đã sử dụng glob.iglobcho một cấu trúc thư mục tương tự như

data
└───train
   └───subfolder1
   |      file111.png
   |      file112.png
   |      ...
   |
   └───subfolder2
          file121.png
          file122.png
          ...
└───test
       file221.png
       file222.png

Cả hai tùy chọn sau đều trả về 4 (như mong đợi, tức là không tính chính các thư mục con )

  • len(list(glob.iglob("data/train/*/*.png", recursive=True)))
  • sum(1 for i in glob.iglob("data/train/*/*.png"))

0

tôi đã làm điều này và điều này trả về số lượng tệp trong thư mục (Attack_Data) ... điều này hoạt động tốt.

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
path = r"C:\Users\EE EKORO\Desktop\Attack_Data" #Read files in folder
print (fcount(path))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.