पायथन का उपयोग करके निर्देशिका में फ़ाइलों की संख्या की गणना कैसे करें


224

मुझे पायथन का उपयोग करके निर्देशिका में फ़ाइलों की संख्या गिनने की आवश्यकता है।

मुझे लगता है कि सबसे आसान तरीका है len(glob.glob('*')), लेकिन यह भी एक फ़ाइल के रूप में निर्देशिका ही मायने रखता है।

क्या किसी निर्देशिका में केवल फाइलों को गिनने का कोई तरीका है ?


निर्देशिकाओं को छोड़ने के लिए, आप जो भी फ़ाइल एक्सटेंशन ढूंढ रहे हैं, उसके लिए '* .fileextension' कर सकते हैं।

जवाबों:


275

os.listdir()उपयोग करने से थोड़ा अधिक कुशल होगा glob.glob। यह जांचने के लिए कि क्या फ़ाइल नाम एक साधारण फ़ाइल है (और निर्देशिका या अन्य इकाई नहीं है), उपयोग करें 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 पर नहीं हैं तो folder_pathअंदर को जोड़ना os.path.filename(name)न भूलें। stackoverflow.com/questions/17893542/…
राफेल ओलिवेरा

1
यह नेस्टेड फ़ोल्डर्स के अंदर फ़ाइल की गणना नहीं करता है।
कोडर्सोफ्थेडार्क

5
निर्देशिकाओं के अंदर नेस्टेड फ़ाइलों की पुनरावृत्ति के लिए, आप os.walk () समाधान के साथ बेहतर हो सकते हैं।
जोएल बी

os.path.join(DIR, name)ओवर का उपयोग करने का क्या लाभ है DIR + '/' + name? उत्तरार्द्ध छोटा है और, IMO, पूर्व की तुलना में अधिक स्पष्ट है। वहाँ शायद कुछ ओएस है: जिस पर बाद विफल होगा?
हैलोगूडीबाई

@HelloGoodbye यही कारण है।
ellockie


48

सभी प्रकार की फ़ाइलों के लिए, उपनिर्देशिकाएं शामिल हैं:

import os

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

केवल फाइलें (उपनिर्देशिका से परहेज):

import os

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

यह पुनरावर्ती नहीं है
काइल ब्रिडेनस्टाइन

32

यह वह जगह है जहाँ fnmatch बहुत काम आता है:

import fnmatch

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

अधिक जानकारी: http://docs.python.org/2/library/fnmatch.html


3
यह बहुत तेज़ है (10,000 फ़ाइलों के साथ एक निर्देशिका पर मेरे परीक्षण के साथ लगभग आधा) यदि आप उस पैटर्न को जानते हैं जो आप देख रहे हैं, बल्कि तब प्रत्येक फ़ाइल os.path.isfile()को स्वीकृत उत्तर के रूप में परीक्षण कर रहा है। से भी काफी तेज glob.glob()
CivFan

14

यदि आप निर्देशिका में सभी फ़ाइलों को गिनना चाहते हैं - उपनिर्देशिकाओं में फ़ाइलों सहित, सबसे पाइथोनिक तरीका है:

import os

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

हम उस राशि का उपयोग करते हैं जो फ़ाइल गणनाओं को स्पष्ट रूप से जोड़ने की तुलना में तेज़ है (लंबित समय)


1
नमस्ते, मैं इस कोड (कोड सही काम करता है) को समझने की कोशिश कर रहा था, मुझे पता है कि हम _एक forलूप में उपयोग कर सकते हैं । os.walkमुझे भी पता है। लेकिन यकीन नहीं है कि sumसमारोह के अंदर अंडरस्कोर के साथ क्या हो रहा है , क्या आप विस्तृत रूप से बता सकते हैं। धन्यवाद!
एजाज

1
Unsderscore सिर्फ एक वैरिएबल का नाम @Eazaz है, कन्वेंशन द्वारा उपयोग किया जाता है जब हम वैरिएबल को नजरअंदाज करते हैं - यही हम यहां करते हैं - हम वॉक को कॉल करते हैं और केवल प्रत्येक डायरेक्टरी में फाइलों की संख्या की गणना करते हैं, रूट और dirs वॉक रिटर्न मानों की अनदेखी करते हैं
Mrand_Mrs_D


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

मुझे आश्चर्य है कि किसी ने उल्लेख नहीं किया है os.scandir:

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

अजगर 3.6 के साथ महान काम करता है!
अनोखी अहिसातसू

7

यह os.listdirकिसी भी निर्देशिका के लिए उपयोग और काम करता है:

import os
directory = 'mydirpath'

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

इसे जनरेटर से सरल बनाया जा सकता है और इसके साथ थोड़ा सा तेज किया जा सकता है:

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


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

ल्यूक का कोड सुधार।

import os

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

4

यहाँ एक सरल एक-लाइन कमांड है जो मुझे उपयोगी लगी:

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

के आउटपुट को पार्स किया जाता है, lsयह आम तौर पर फेल होता है (यह अक्सर समस्या पैदा कर सकता है), हालांकि यह शेल में एक "त्वरित और गंदा" तरीका नहीं है। ls -1हालाँकि, आपको उपयोग करना चाहिए , इसलिए यह प्रति फ़ाइल एक पंक्ति की गारंटी देता है।
ब्लडगैन

3

जबकि मैं @DanielStutzbach द्वारा प्रदान किए गए उत्तर से सहमत हूं: os.listdir()उपयोग करने की तुलना में थोड़ा अधिक कुशल होगा glob.glob

हालांकि, एक अतिरिक्त परिशुद्धता, यदि आप फ़ोल्डर में विशिष्ट फ़ाइलों की संख्या की गणना करना चाहते हैं, तो आप उपयोग करना चाहते हैं len(glob.glob())। उदाहरण के लिए यदि आप एक फ़ोल्डर में सभी pdfs को गिनना चाहते थे, जिसका आप उपयोग करना चाहते हैं:

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

2

यह आसान है:

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

यह बस निर्देशिका में फ़ाइलों की संख्या को गिनाता है, मैंने विशिष्ट निर्देशिका के माध्यम से पुनरावृति करने के लिए सूची बोध तकनीक का उपयोग किया है, बदले में सभी फाइलें लौटाता है। "लेन (लौटी हुई सूची)" फाइलों की संख्या लौटाती है।


1
ढेर अतिप्रवाह में आपका स्वागत है। इस उत्तर की गुणवत्ता में एक व्याख्या जोड़कर सुधार किया जा सकता है: उत्तर कैसे दें
Elletlar

1
थैंक्यू एलेटलर, मैंने अपना उत्तर संपादित कर दिया है, मैं और अधिक व्यापक तरीके से जवाब देना सुनिश्चित करूंगा: डी
आगा साद

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)

ओपी ने फाइलों की संख्या के लिए कहा , यह निर्देशिकाओं को भी सूचीबद्ध करता है।
कोरम

1

यदि आप ऑपरेटिंग सिस्टम के मानक शेल का उपयोग कर रहे हैं, तो आप शुद्ध पायथोनिक तरीके का उपयोग करने के बजाय परिणाम बहुत तेजी से प्राप्त कर सकते हैं।

विंडोज के लिए उदाहरण:

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
लेकिन यह उतना पोर्टेबल नहीं होगा।
पोलितंक-जेड

1

मुझे एक और उत्तर मिला जो स्वीकृत उत्तर के रूप में सही हो सकता है।

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

मैं glob.iglobएक निर्देशिका संरचना के लिए इस्तेमाल किया

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

निम्नलिखित दोनों विकल्प 4 लौटते हैं (जैसा कि अपेक्षित है, यानी सबफ़ोल्डर्स को स्वयं नहीं गिना जाता है )

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

0

मैंने ऐसा किया और इस फ़ोल्डर में फ़ाइलों की संख्या (Attack_Data) वापस कर दी ... यह ठीक काम करता है।

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))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.