วิธีนับจำนวนไฟล์ในไดเรกทอรีโดยใช้ Python


224

ฉันต้องนับจำนวนไฟล์ในไดเรกทอรีโดยใช้ Python

ฉันเดาว่าวิธีที่ง่ายที่สุดคือlen(glob.glob('*'))แต่นั่นก็นับไดเรกทอรีเองเป็นไฟล์

มีวิธีการนับเฉพาะไฟล์ในไดเรกทอรีหรือไม่?


หากต้องการออกจากไดเรกทอรีคุณสามารถทำ '* .fileextension' สำหรับนามสกุลไฟล์ที่คุณต้องการ

คำตอบ:


276

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)ถ้าคุณไม่ได้อยู่ใน cwd stackoverflow.com/questions/17893542/…
Rafael Oliveira

1
สิ่งนี้จะไม่นับไฟล์ภายในโฟลเดอร์ที่ซ้อนกัน
codersofthedark

5
สำหรับการนับไฟล์ซ้ำ ๆ ในไดเรกทอรีคุณอาจจะดีกว่าด้วยโซลูชัน os.walk ()
Joel B

ประโยชน์ของการใช้os.path.join(DIR, name)เกินDIR + '/' + nameคืออะไร? หลังสั้นกว่าและ IMO ชัดเจนกว่าแบบเดิม อาจมีระบบปฏิบัติการบ้างไหม: ระบบปฏิบัติการใดบ้างที่จะล้มเหลว?
HelloGoodbye

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

นี่ไม่ใช่แบบเรียกซ้ำ
Kyle Bridenstine

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

หากคุณต้องการนับไฟล์ทั้งหมดในไดเรกทอรี - รวมถึงไฟล์ในไดเรกทอรีย่อยวิธี pythonic ที่ดีที่สุดคือ:

import os

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

เราใช้ผลรวมที่เร็วกว่าการเพิ่มจำนวนไฟล์อย่างชัดเจน (รอการกำหนดเวลา)


1
สวัสดีฉันพยายามเข้าใจรหัสนี้ (รหัสทำงานได้สมบูรณ์แบบ) ฉันรู้ว่าเราสามารถใช้งานได้_ในforวงวน os.walkฉันก็รู้เช่นกัน แต่ไม่แน่ใจว่าเกิดอะไรขึ้นกับขีดล่างในsumฟังก์ชั่นคุณช่วยอธิบายได้ไหม ขอบคุณ!
Ejaz

1
Unsderscore เป็นเพียงชื่อตัวแปร @Ejaz ตามระเบียบที่ใช้เมื่อเราไม่สนใจตัวแปร - นั่นคือสิ่งที่เราทำที่นี่ - เราเรียกใช้ walk และนับเฉพาะจำนวนไฟล์ในแต่ละไดเรกทอรีโดยไม่สนใจค่ารูทและ dirs walk
Mr_and_Mrs_D

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

2
สิ่งนี้อาจมีประโยชน์ในบางครั้ง แต่มันมีไดเรกทอรีย่อยในการนับด้วย
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

ฉันประหลาดใจที่ไม่มีใครพูดถึงos.scandir:

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

ใช้งานได้ดีกับ Python 3.6!
Aoki Ahishatsu

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

นี่เป็นคำสั่งแบบบรรทัดเดียวที่ฉันพบว่ามีประโยชน์:

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

การแยกวิเคราะห์ผลลัพธ์ของlsfrowned โดยทั่วไป (อาจทำให้เกิดปัญหาได้บ่อย) แม้ว่านี่จะไม่ใช่วิธี "ที่รวดเร็วและสกปรก" ที่เชลล์ คุณควรใช้ls -1อย่างไรก็ตามมันรับประกันหนึ่งบรรทัดต่อไฟล์
Bloodgain

3

ในขณะที่ฉันเห็นด้วยกับคำตอบของ @DanielStutzbach: os.listdir()จะมีประสิทธิภาพมากกว่าการใช้เล็กน้อยglob.globเล็กน้อย

len(glob.glob())อย่างไรก็ตามความแม่นยำเป็นพิเศษถ้าคุณไม่ต้องการที่จะนับจำนวนเฉพาะไฟล์ในโฟลเดอร์ที่คุณต้องการใช้ ตัวอย่างเช่นหากคุณนับ PDF ทั้งหมดในโฟลเดอร์ที่คุณต้องการใช้:

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

2

มันง่าย:

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

มันเพียงนับจำนวนไฟล์ในไดเรกทอรีฉันได้ใช้เทคนิคความเข้าใจในรายการเพื่อย้ำผ่านไดเรกทอรีเฉพาะที่ส่งคืนไฟล์ทั้งหมดในคืน "len (รายการที่ส่งคืน)" ส่งคืนจำนวนไฟล์


1
ยินดีต้อนรับสู่ Stack Overflow คุณภาพของคำตอบนี้สามารถปรับปรุงได้โดยการเพิ่มคำอธิบาย: วิธีตอบ
Elletlar

1
ขอบคุณ Elletlar ฉันได้แก้ไขคำตอบของฉันฉันจะทำให้แน่ใจว่าจะตอบในลักษณะที่ครอบคลุมมากขึ้น: 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 ขอจำนวนไฟล์ซึ่งจะแสดงรายการไดเรกทอรีด้วย
Korem

1

หากคุณใช้เชลล์มาตรฐานของระบบปฏิบัติการคุณจะได้รับผลลัพธ์เร็วกว่าการใช้วิธี pythonic ล้วนๆ

ตัวอย่างสำหรับ 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
แต่มันจะไม่เป็นแบบพกพา
Politank-Z

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))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.