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?

prosseek
sumber
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))])
Daniel Stutzbach
sumber
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
102
import os

path, dirs, files = next(os.walk("/usr/lib"))
file_count = len(files)
Luke
sumber
2
Ini bukan rekursif
Kyle Bridenstine
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)
Guillermo Pereira
sumber
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

ngeek
sumber
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)

Mr_and_Mrs_D
sumber
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()))
ruam
sumber
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
ninjrok
sumber
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()])
qed
sumber
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)))
joaquin
sumber
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

Kristian Damian
sumber
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
tzot
sumber
4

Kode Luke diformat ulang.

import os

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

Ini adalah perintah satu baris sederhana yang menurut saya berguna:

print int(os.popen("ls | wc -l").read())
Bojan Tunguz
sumber
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"))
LBes
sumber
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.

Agha Saad
sumber
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)
Mohit Dabas
sumber
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))
styler
sumber
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) 
Ismail
sumber
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"))
pengguna799188
sumber
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))
Sam Ekoro
sumber