Python kullanarak bir dizindeki dosya sayısı nasıl hesaplanır


224

Python kullanarak bir dizindeki dosya sayısını saymak gerekir.

Sanırım en kolay yolu len(glob.glob('*')), ama aynı zamanda dizinin kendisini bir dosya olarak sayar.

Bir dizindeki dosyaları saymanın herhangi bir yolu var mı ?


Dizinleri dışarıda bırakmak için, aradığınız dosya uzantısı için '* .fileextension' yapabilirsiniz.

Yanıtlar:


276

os.listdir()kullanmaktan biraz daha verimli olacaktır glob.glob. Bir dosya adının sıradan bir dosya olup olmadığını (dizin veya başka bir varlık değil) test etmek için şunu kullanın 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
Cwd'de değilseniz , folder_pathiçini eklemeyi unutmayın os.path.filename(name). stackoverflow.com/questions/17893542/…
Rafael Oliveira

1
Bu, iç içe klasörlerin içindeki dosyayı saymaz.
codersofthedark

5
Dizinlerin içine yerleştirilmiş dosyaları yinelemeli olarak saymak için os.walk () çözümü ile daha iyi durumda olabilirsiniz.
Joel B

os.path.join(DIR, name)Üzerinden kullanmanın yararı nedir DIR + '/' + name? İkincisi daha kısa ve IMO, öncekinden daha açıktır. Muhtemelen ikincisinin başarısız olacağı bazı işletim sistemleri var mı?
16:46

@HelloGoodbye Tam da nedeni bu.
ellockie


48

Tüm dosya türleri için alt dizinler şunları içerir:

import os

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

Yalnızca dosyalar (alt dizinlerden kaçınma):

import os

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

Bu özyinelemeli değil
Kyle Bridenstine

32

Burada fnmatch çok kullanışlı oluyor:

import fnmatch

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

Daha fazla ayrıntı: http://docs.python.org/2/library/fnmatch.html


3
Aradığınız deseni biliyorsanız, her bir dosyayı os.path.isfile()kabul edilen yanıtla test etmek yerine, bu çok daha hızlıdır (10,000 dosya içeren bir dizindeki testlerimin yarısı kadar) . Ayrıca önemli ölçüde daha hızlı glob.glob().
CivFan

14

Dizindeki tüm dosyaları (alt dizinlerdeki dosyalar da dahil olmak üzere) saymak istiyorsanız, en pitonik yol şudur:

import os

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

Dosya sayımlarını açıkça eklemekten daha hızlı olan toplamı kullanıyoruz (zamanlamalar beklemede)


1
Merhaba, bu kodu anlamaya çalışıyordum (kod mükemmel çalışıyor), _bir fordöngüde kullanabileceğimizi biliyorum . os.walkayrıca biliyorum. Ama sumişlevin içinde alt çizgi ile neler olup bittiğinden emin değil misiniz, lütfen biraz ayrıntı verebilir misiniz? Teşekkürler!
Ejaz

1
Unsderscore, değişkeni yok saydığımızda kullanılan kongre ile sadece bir değişken adı @Ejaz'dır - burada yaptığımız şey budur - biz walk diyoruz ve her dizindeki dosya sayısını sayıyoruz, kök ve dirs walk dönüş değerlerini yok sayıyoruz
Mr_and_Mrs_D

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

2
Bu bazen yararlı olabilir, ancak sayıdaki alt dizinleri de içerir
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

Kimsenin bahsetmediğine şaşırdım os.scandir:

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

Python 3.6 ile harika çalışıyor!
Aoki Ahishatsu

7

Bu os.listdirherhangi bir dizin için kullanır ve çalışır:

import os
directory = 'mydirpath'

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

bu bir jeneratörle basitleştirilebilir ve aşağıdakilerle biraz daha hızlı hale getirilebilir:

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

Bu gönderiden alındı


2
1. filesbir listedir. 2. OP özyinelemeli sayım
aramıyor

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

Luke'un kod reformu.

import os

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

4

İşte yararlı bulduğum basit bir tek satırlık komut:

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

Çıktısının ayrıştırılması lsgenel olarak kaşlarını çatmıştır (sıklıkla sorunlara neden olabilir), ancak bu kabukta kötü bir "çabuk ve kirli" yöntem değildir. ls -1Yine de kullanmalısınız , böylece dosya başına bir satır garanti eder.
Bloodgain

3

@DanielStutzbach'ın verdiği yanıta katılırken: os.listdir()kullanmaktan biraz daha verimli olacak glob.glob.

Ancak, klasördeki belirli dosya sayısını saymak istiyorsanız, kullanmak istediğiniz ekstra bir hassasiyet len(glob.glob()). Örneğin, kullanmak istediğiniz bir klasördeki tüm pdf'leri sayacak olsaydınız:

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

2

Basit:

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

sadece dizindeki dosya sayısını sayar, ben tüm dosyaları geri dönen belirli bir dizini yinelemek için liste anlama tekniği kullandık. "len (döndürülen liste)" dosya sayısını döndürür.


1
Stack Overflow'a hoş geldiniz. Bu cevabın kalitesi bir açıklama ekleyerek geliştirilebilir: Nasıl
Yanıtlanır

1
Teşekkür Elletlar, cevabımı düzenledim, daha kapsamlı bir şekilde yanıt vereceğimden emin olacağım: 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 dosya sayısını istedi , bu da dizinleri listeler.
Korem

1

İşletim sisteminin standart kabuğunu kullanacaksanız, saf pitonik yol kullanmak yerine sonucu çok daha hızlı alabilirsiniz.

Windows için örnek:

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
Ama bu kadar taşınabilir olmayacak.
Politank-Z

1

Kabul edilen cevap olarak doğru olabilecek başka bir cevap buldum.

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

Kullandığım glob.iglobbenzer bir dizin yapısı için

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

Aşağıdaki seçeneklerin her ikisi de 4 döndürür (beklendiği gibi, yani alt klasörleri saymaz )

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

0

Bunu yaptım ve bu klasördeki (Attack_Data) dosya sayısını döndürdü ... Bu iyi çalışıyor.

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))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.