Como contar o número de arquivos em um diretório usando Python

224

Eu preciso contar o número de arquivos em um diretório usando Python.

Eu acho que a maneira mais fácil é len(glob.glob('*')), mas isso também conta o próprio diretório como um arquivo.

Existe alguma maneira de contar apenas os arquivos em um diretório?

prosseek
fonte
Para deixar de fora os diretórios, você pode fazer '* .fileextension' para qualquer extensão de arquivo que esteja procurando.

Respostas:

275

os.listdir()será um pouco mais eficiente do que usar glob.glob. Para testar se um nome de arquivo é um arquivo comum (e não um diretório ou outra entidade), 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
fonte
14
Lembre-se de adicionar o folder_pathinterior, os.path.filename(name)se você não estiver no cwd. stackoverflow.com/questions/17893542/…
Rafael Oliveira
1
Isso não conta o arquivo dentro de pastas aninhadas.
Codsofthedark 23/04
5
Para contar recursivamente arquivos aninhados dentro de diretórios, você pode se sair melhor com a solução os.walk ().
Joel B
Qual é o benefício de usar os.path.join(DIR, name)mais DIR + '/' + name? O último é mais curto e, na IMO, mais claro que o primeiro. Existe, talvez, alguns SOs nos quais o último falharia?
hellogoodbye
@ HelloGoodbye Essa é exatamente a razão.
22816 ellockie
102
import os

path, dirs, files = next(os.walk("/usr/lib"))
file_count = len(files)
Lucas
fonte
2
Isso não é recursivo
Kyle Bridenstine
48

Para todos os tipos de arquivos, os subdiretórios incluem:

import os

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

Somente arquivos (evitando subdiretórios):

import os

onlyfiles = next(os.walk(dir))[2] #dir is your directory path as string
print len(onlyfiles)
Guillermo Pereira
fonte
Isso não é recursivo
Kyle Bridenstine
32

É aqui que o fnmatch é muito útil:

import fnmatch

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

Mais detalhes: http://docs.python.org/2/library/fnmatch.html

ngeek
fonte
3
Isso é muito mais rápido (cerca da metade do tempo em meus testes em um diretório com 10.000 arquivos) se você souber o padrão que está procurando, em vez de testar cada arquivo com os.path.isfile()a resposta aceita. Também significativamente mais rápido que glob.glob().
precisa saber é
14

Se você deseja contar todos os arquivos no diretório - incluindo arquivos em subdiretórios, a maneira mais pitônica é:

import os

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

Usamos soma que é mais rápida do que adicionar explicitamente a contagem de arquivos (tempos pendentes)

Mr_and_Mrs_D
fonte
1
Oi, eu estava tentando entender esse código (o código funciona perfeito), eu sei que podemos usar _em um forloop. os.walktambém eu sei. Mas não tenho certeza do que está acontecendo com sublinhados dentro da sumfunção, você poderia elaborar. Obrigado!
Ejaz
1
Unsderscore é apenas um nome de variável @Ejaz, por convenção usada quando ignoramos a variável - é o que fazemos aqui - chamamos walk e contamos apenas o número de arquivos em cada diretório, ignorando os valores de retorno root e dirs walk
Mr_and_Mrs_D
12
import os
print len(os.listdir(os.getcwd()))
erupção cutânea
fonte
2
Isso pode ser, por vezes, útil, mas inclui subdiretórios na contagem também
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
fonte
10

Estou surpreso que ninguém tenha mencionado os.scandir:

def count_files(dir):
    return len([1 for x in list(os.scandir(dir)) if x.is_file()])
qed
fonte
Funciona muito bem com o Python 3.6!
Aoki Ahishatsu
7

Isso usa os.listdire funciona para qualquer diretório:

import os
directory = 'mydirpath'

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

isso pode ser simplificado com um gerador e acelerado um pouco com:

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

Retirado desta postagem

Kristian Damian
fonte
2
1. filesé uma lista. 2. OP não está procurando contagem recursiva
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
fonte
4

O código de Lucas reformata.

import os

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

Aqui está um comando simples de uma linha que eu achei útil:

print int(os.popen("ls | wc -l").read())
Bojan Tunguz
fonte
A análise da saída de lsgeralmente é desaprovada (geralmente pode causar problemas), embora esse não seja um método "rápido e sujo" ruim no shell. Você deve usar ls -1, no entanto, para garantir uma linha por arquivo.
Bloodgain
3

Embora eu concorde com a resposta fornecida por @DanielStutzbach: os.listdir()será um pouco mais eficiente do que usar glob.glob.

No entanto, uma precisão extra, se você deseja contar o número de arquivos específicos na pasta, deseja usar len(glob.glob()). Por exemplo, se você contar todos os PDFs em uma pasta que deseja usar:

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

É simples:

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

simplesmente conta o número de arquivos no diretório, usei a técnica de compreensão de lista para percorrer um diretório específico, retornando todos os arquivos em troca. "len (lista retornada)" retorna o número de arquivos.

Agha Saad
fonte
1
Bem-vindo ao Stack Overflow. A qualidade desta resposta pode ser melhorada adicionando uma explicação: Como responder
Elletlar
1
Obrigado Elletlar, eu editei minha resposta, vou me certificar de responder de maneira mais abrangente: 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
fonte
O OP solicitou o número de arquivos , isso também lista os diretórios.
Korem
1

Se você usar o shell padrão do sistema operacional, poderá obter o resultado muito mais rápido do que usar o modo python puro.

Exemplo 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))
estilista
fonte
1
Mas não será tão portátil.
Politank Z-
1

Encontrei outra resposta que pode estar correta como resposta aceita.

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
fonte
0

Eu usei glob.iglobpara uma estrutura de diretório semelhante a

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

As duas opções a seguir retornam 4 (conforme o esperado, ou seja, não contam as próprias subpastas )

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

Eu fiz isso e isso retornou o número de arquivos na pasta (Attack_Data) ... isso funciona bem.

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
fonte