Cara menghitung jumlah file dalam direktori menggunakan Python


224

Saya perlu menghitung jumlah file dalam direktori menggunakan Python.

Saya kira cara termudah adalah len(glob.glob('*')), tetapi itu juga menghitung direktori itu sendiri sebagai file.

Apakah ada cara untuk menghitung hanya file dalam direktori?


Untuk meninggalkan direktori, Anda dapat melakukan '* .fileextension' untuk ekstensi file apa pun yang Anda cari.

Jawaban:


275

os.listdir()akan sedikit lebih efisien daripada menggunakan glob.glob. Untuk menguji apakah nama file adalah file biasa (dan bukan direktori atau entitas lain), gunakan 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
Ingatlah untuk menambahkan bagian folder_pathdalam os.path.filename(name)jika Anda tidak menggunakan cwd. stackoverflow.com/questions/17893542/…
Rafael Oliveira

1
Ini tidak menghitung file di dalam folder bersarang.
codersofthedark

5
Untuk menghitung file secara berulang yang bersarang di dalam direktori, Anda mungkin lebih baik dengan solusi os.walk ().
Joel B

Apa manfaat menggunakan os.path.join(DIR, name)lebih DIR + '/' + name? Yang terakhir lebih pendek dan, IMO, lebih jelas dari yang pertama. Apakah mungkin ada beberapa OS: di mana yang terakhir akan gagal?
HelloGoodbye

@ HaloGoodbye Itulah alasannya.
ellockie


48

Untuk semua jenis file, subdirektori termasuk:

import os

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

Hanya file (menghindari subdirektori):

import os

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

Ini bukan rekursif
Kyle Bridenstine

32

Di sinilah fnmatch menjadi sangat berguna:

import fnmatch

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

Rincian lebih lanjut: http://docs.python.org/2/library/fnmatch.html


3
Ini jauh lebih cepat (sekitar separuh waktu dengan pengujian saya pada direktori dengan 10.000 file) jika Anda tahu pola yang Anda cari, daripada menguji setiap file dengan os.path.isfile()seperti jawaban yang diterima. Juga secara signifikan lebih cepat daripada glob.glob().
CivFan

14

Jika Anda ingin menghitung semua file dalam direktori - termasuk file dalam subdirektori, cara yang paling pythonic adalah:

import os

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

Kami menggunakan jumlah yang lebih cepat daripada secara eksplisit menambahkan jumlah file (timing tertunda)


1
Hai, saya mencoba memahami kode ini (kode ini berfungsi dengan sempurna), saya tahu kita dapat menggunakannya _dalam satu forlingkaran. os.walksaya juga tahu. Tapi tidak yakin apa yang terjadi dengan garis bawah di dalam sumfungsi, bisa tolong jelaskan. Terima kasih!
Ejaz

1
Unsderscore hanyalah nama variabel @Ejaz, dengan konvensi yang digunakan ketika kita mengabaikan variabel - itulah yang kita lakukan di sini - kita sebut berjalan dan hanya menghitung jumlah file di setiap direktori, mengabaikan nilai pengembalian root dan dirs walk
Mr_and_Mrs_D

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

2
Ini mungkin berguna kadang-kadang tetapi juga termasuk subdirektori dalam penghitungan
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

Saya terkejut bahwa tidak ada yang menyebutkan os.scandir:

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

Bekerja dengan Python 3.6!
Aoki Ahishatsu

7

Ini menggunakan os.listdirdan berfungsi untuk direktori apa pun:

import os
directory = 'mydirpath'

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

ini dapat disederhanakan dengan generator dan dibuat sedikit lebih cepat dengan:

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

Diambil dari pos ini


2
1. filesadalah daftar. 2. OP tidak mencari hitungan rekursif
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

Kode Luke diformat ulang.

import os

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

4

Ini adalah perintah satu baris sederhana yang menurut saya berguna:

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

Parsing output lsumumnya disukai (sering dapat menyebabkan masalah), meskipun ini bukan metode "cepat-dan-kotor" yang buruk di shell. Anda harus menggunakan ls -1, jadi itu menjamin satu baris per file.
Bloodgain

3

Sementara saya setuju dengan jawaban yang diberikan oleh @DanielStutzbach: os.listdir() akan sedikit lebih efisien daripada menggunakan glob.glob.

Namun, ketepatan ekstra, jika Anda ingin menghitung jumlah file tertentu dalam folder, Anda ingin menggunakannya len(glob.glob()). Misalnya jika Anda menghitung semua pdf dalam folder yang ingin Anda gunakan:

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

2

Sederhana:

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

itu hanya menghitung jumlah file dalam direktori, saya telah menggunakan teknik pemahaman daftar untuk beralih melalui direktori tertentu mengembalikan semua file sebagai balasannya. "len (daftar yang dikembalikan)" mengembalikan jumlah file.


1
Selamat datang di Stack Overflow. Kualitas jawaban ini dapat ditingkatkan dengan menambahkan penjelasan: Cara Menjawab
Elletlar

1
Terima kasih Elletlar, saya telah mengedit jawaban saya, saya akan memastikan untuk merespons dengan cara yang lebih komprehensif: 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 meminta jumlah file , ini daftar direktori juga.
Korem

1

Jika Anda akan menggunakan shell standar dari sistem operasi, Anda bisa mendapatkan hasilnya jauh lebih cepat daripada menggunakan cara pythonic murni.

Contoh untuk 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
Tapi itu tidak akan seperti portabel.
Politank-Z

1

Saya menemukan jawaban lain yang mungkin benar sebagai jawaban yang diterima.

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

Saya menggunakan glob.iglobstruktur direktori yang mirip dengan

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

Kedua opsi berikut mengembalikan 4 (seperti yang diharapkan, yaitu tidak menghitung sendiri subfolder )

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

0

saya melakukan ini dan ini mengembalikan jumlah file di folder (Attack_Data) ... ini berfungsi dengan baik.

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))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.