পাইথন ব্যবহার করে কোনও ডিরেক্টরিতে ফাইলগুলির সংখ্যা কীভাবে গণনা করা যায়


224

পাইথন ব্যবহার করে আমাকে একটি ডিরেক্টরিতে ফাইল সংখ্যা গণনা করতে হবে।

আমি অনুমান করি সবচেয়ে সহজ উপায় len(glob.glob('*'))তবে এটি ডিরেক্টরিটিকে ফাইল হিসাবেও গণনা করে।

কোনও ডিরেক্টরিতে কেবল ফাইলগুলি গণনা করার কোনও উপায় আছে ?


ডিরেক্টরিগুলি ছাড়ার জন্য, আপনি যে ফাইল ফাইল এক্সটেনশানটির জন্য সন্ধান করছেন তার জন্য '* .ফাইল এক্সটেনশন' করতে পারেন।

উত্তর:


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
আপনি সিডব্লিউডিতে না থাকলে folder_pathঅভ্যন্তরটি যুক্ত os.path.filename(name)করতে ভুলবেন না। stackoverflow.com/questions/17893542/…
রাফায়েল অলিভিয়রা

1
এটি নেস্টেড ফোল্ডারগুলির মধ্যে ফাইল গণনা করে না।
কোডারসোফিডার্ক

5
ডিরেক্টরিগুলির অভ্যন্তরে পুনরাবৃত্তভাবে ফাইলগুলি গণনা করার জন্য, আপনি ওএসওয়াক () সমাধানটি দিয়ে আরও ভাল হতে পারেন।
জোয়েল বি

os.path.join(DIR, name)ওভার ব্যবহার করে DIR + '/' + nameকী লাভ ? দ্বিতীয়টি সংক্ষিপ্ত এবং আইএমও, পূর্বের চেয়ে আরও স্পষ্ট। সম্ভবত কিছু ওএস আছে: এস এর উপরেরটি ব্যর্থ হবে?
হ্যালো গুডবাই

@ হেলো গুডবাই ঠিক এ কারণেই।
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()
সিভিফ্যান

13

আপনি যদি ডিরেক্টরিতে সমস্ত ফাইল গণনা করতে চান - উপ-ডিরেক্টরিতে ফাইল সহ, সর্বাধিক পাইথোনিক উপায়:

import os

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

আমরা স্পষ্টভাবে ফাইলের সংখ্যার চেয়ে দ্রুতগতির সমষ্টিটি ব্যবহার করি (সময়গুলি মুলতুবি রয়েছে)


1
হাই, আমি এই কোডটি বোঝার চেষ্টা করছিলাম (কোডটি নিখুঁতভাবে কাজ করে), আমি জানি আমরা _একটি forলুপ ব্যবহার করতে পারি । os.walkআমি জানি। তবে নিশ্চিত না যে sumফাংশনের অভ্যন্তরে আন্ডারস্কোরগুলি দিয়ে কী চলছে , আপনি দয়া করে বিস্তারিত বলতে পারেন। ধন্যবাদ!
এজাজ

1
আনসডারস্কোর হ'ল একটি পরিবর্তনশীল নাম @ এজাজ, কনভেনশন অনুসারে ব্যবহৃত হয় যখন আমরা ভেরিয়েবলটিকে উপেক্ষা করি - আমরা এখানে যা করি - আমরা রুট এবং
ডায়ার


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

9

আমি অবাক হয়েছি যে কেউ উল্লেখ করেনি 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

যদিও আমি @ ড্যানিয়েল স্টুটজবাচের প্রদত্ত উত্তরের সাথে একমত: os.listdir()ব্যবহার করার চেয়ে কিছুটা দক্ষ হবে glob.glob

তবে একটি অতিরিক্ত নির্ভুলতা, আপনি যদি ফোল্ডারে নির্দিষ্ট ফাইলগুলির সংখ্যা গণনা করতে চান তবে আপনি ব্যবহার করতে চান len(glob.glob())। উদাহরণস্বরূপ আপনি যদি কোনও ফোল্ডারে যে সমস্ত পিডিএফ ব্যবহার করতে চান তা গণনা করতে হয়:

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

2

এটা সহজ:

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

এটি কেবল ডিরেক্টরিতে ফাইলগুলির সংখ্যা গণনা করে, আমি সমস্ত ফাইলকে প্রত্যাবর্তন করে নির্দিষ্ট ডিরেক্টরি দিয়ে পুনরাবৃত্তি করতে তালিকা বোঝার কৌশলটি ব্যবহার করেছি। "লেন (প্রত্যাবর্তিত তালিকা)" ফাইলের সংখ্যা দেয়।


1
স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম। এই উত্তরটির গুণমান একটি ব্যাখ্যা যুক্ত করে উন্নত করা যেতে পারে: কীভাবে উত্তর দিন
এললেটর

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

আমি এটি করেছি এবং এটি ফোল্ডারে (অ্যাটাক_ডাটা) ফাইল সংখ্যা ফিরিয়ে দিয়েছে ... এটি দুর্দান্ত কাজ করে।

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))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.