Cómo contar la cantidad de archivos en un directorio usando Python


224

Necesito contar la cantidad de archivos en un directorio usando Python.

Supongo que la forma más fácil es len(glob.glob('*')), pero eso también cuenta el directorio en sí como un archivo.

¿Hay alguna manera de contar solo los archivos en un directorio?


Para omitir directorios, puede hacer '* .fileextension' para cualquier extensión de archivo que esté buscando.

Respuestas:


275

os.listdir()será un poco más eficiente que usar glob.glob. Para probar si un nombre de archivo es un archivo ordinario (y no un directorio u otra entidad), use 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
Recuerde agregar el folder_pathinterior os.path.filename(name)si no está en el cwd. stackoverflow.com/questions/17893542/…
Rafael Oliveira

1
Esto no cuenta el archivo dentro de las carpetas anidadas.
codersofthedark

55
Para contar recursivamente archivos anidados dentro de directorios, puede que sea mejor con la solución os.walk ().
Joel B

¿Cuál es el beneficio de usar os.path.join(DIR, name)más DIR + '/' + name? El último es más corto y, en mi opinión, más claro que el primero. ¿Hay quizás algunos OS: es en los que este último fallaría?
HelloGoodbye

@HelloGoodbye Esa es exactamente la razón.
ellockie


48

Para todo tipo de archivos, los subdirectorios incluyen:

import os

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

Solo archivos (evitando subdirectorios):

import os

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

Esto no es recursivo
Kyle Bridenstine

32

Aquí es donde fnmatch es muy útil:

import fnmatch

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

Más detalles: http://docs.python.org/2/library/fnmatch.html


3
Esto es mucho más rápido (aproximadamente la mitad del tiempo con mis pruebas en un directorio con 10,000 archivos) si conoce el patrón que está buscando, en lugar de probar cada archivo con os.path.isfile()la respuesta aceptada. También significativamente más rápido que glob.glob().
CivFan

14

Si desea contar todos los archivos en el directorio, incluidos los archivos en subdirectorios, la forma más pitónica es:

import os

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

Usamos suma que es más rápida que agregar explícitamente los recuentos de archivos (tiempos pendientes)


1
Hola, estaba tratando de entender este código (el código funciona perfecto), sé que podemos usarlo _en un forbucle. os.walkTambién lo sé. Pero no estoy seguro de lo que está sucediendo con los guiones bajos dentro de la sumfunción, ¿podría explicarlo? ¡Gracias!
Ejaz el

1
Unsderscore es solo un nombre de variable @Ejaz, por convención que se usa cuando ignoramos la variable, eso es lo que hacemos aquí, llamamos caminar y solo contamos el número de archivos en cada directorio, ignorando los valores de retorno de la raíz y los directorios
Mr_and_Mrs_D

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

2
Esto puede ser útil a veces, pero también incluye subdirectorios en el recuento
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

Me sorprende que nadie haya mencionado os.scandir:

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

¡Funciona muy bien con Python 3.6!
Aoki Ahishatsu

7

Esto usa os.listdiry funciona para cualquier directorio:

import os
directory = 'mydirpath'

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

Esto puede simplificarse con un generador y hacerse un poco más rápido con:

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

Tomado de esta publicación


2
1. fileses una lista. 2. OP no busca recuento recursivo
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

4

El reformateo del código de Luke.

import os

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

4

Aquí hay un comando simple de una línea que me pareció útil:

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

Analizar la salida de lses generalmente mal visto (con frecuencia puede causar problemas), aunque este no es un mal método "rápido y sucio" en el shell. Sin ls -1embargo, debe usarlo , por lo que garantiza una línea por archivo.
Bloodgain

3

Si bien estoy de acuerdo con la respuesta proporcionada por @DanielStutzbach: os.listdir()será un poco más eficiente que usar glob.glob.

Sin embargo, una precisión adicional, si desea contar el número de archivos específicos en la carpeta, desea utilizar len(glob.glob()). Por ejemplo, si tuviera que contar todos los archivos PDF en una carpeta que desea utilizar:

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

2

Es simple:

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

simplemente cuenta el número de archivos en el directorio, he usado la técnica de comprensión de listas para iterar a través de un directorio específico y devolver todos los archivos a cambio. "len (lista devuelta)" devuelve el número de archivos.


1
Bienvenido a Stack Overflow. La calidad de esta respuesta se puede mejorar agregando una explicación: Cómo responder
Elletlar

1
Gracias Elletlar, he editado mi respuesta, me aseguraré de responder de una manera más completa: 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)

El OP solicitó la cantidad de archivos , esto también enumera los directorios.
Korem

1

Si va a utilizar el shell estándar del sistema operativo, puede obtener el resultado mucho más rápido en lugar de utilizar la forma pitónica pura.

Ejemplo para 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
Pero no será tan portátil.
Politank-Z

1

Encontré otra respuesta que puede ser correcta como respuesta aceptada.

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

Solía glob.iglobuna estructura de directorio similar a

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

Las dos opciones siguientes devuelven 4 (como se esperaba, es decir, no cuenta las subcarpetas )

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

0

Hice esto y devolvió el número de archivos en la carpeta (Attack_Data) ... esto funciona bien.

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))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.