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?

prosseek
fuente
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))])
Daniel Stutzbach
fuente
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
102
import os

path, dirs, files = next(os.walk("/usr/lib"))
file_count = len(files)
Luke
fuente
2
Esto no es recursivo
Kyle Bridenstine
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)
Guillermo Pereira
fuente
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

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

Mr_and_Mrs_D
fuente
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()))
erupción
fuente
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
ninjrok
fuente
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()])
qed
fuente
¡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)))
joaquin
fuente
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

Kristian Damian
fuente
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
tzot
fuente
4

El reformateo del código de Luke.

import os

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

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

print int(os.popen("ls | wc -l").read())
Bojan Tunguz
fuente
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"))
LBes
fuente
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.

Agha Saad
fuente
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)
Mohit Dabas
fuente
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))
styler
fuente
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) 
Ismail
fuente
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"))
usuario799188
fuente
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))
Sam Ekoro
fuente