Как посчитать количество файлов в каталоге, используя Python - PullRequest
166 голосов
/ 13 апреля 2010

Мне нужно посчитать количество файлов в каталоге, используя Python.

Полагаю, самый простой способ - len(glob.glob('*')), но он также считает сам каталог как файл.

Можно ли считать в каталоге только файлы ?

Ответы [ 20 ]

209 голосов
/ 13 апреля 2010

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))])
70 голосов
/ 29 ноября 2011
import os

path, dirs, files = next(os.walk("/usr/lib"))
file_count = len(files)
38 голосов
/ 08 июля 2015

Для всех типов файлов, подкаталоги включены:

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)
29 голосов
/ 01 июня 2013

Здесь очень удобно использовать fnmatch:

import fnmatch

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

Подробнее: http://docs.python.org/2/library/fnmatch.html

12 голосов
/ 01 июля 2014
import os
print len(os.listdir(os.getcwd()))
11 голосов
/ 20 февраля 2013
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
7 голосов
/ 13 апреля 2010

Используется 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)))
7 голосов
/ 18 мая 2017

Я удивлен, что никто не упомянул os.scandir:

def count_files(dir):
    return len([1 for x in list(os.scandir(dir)) if x.is_file()])
6 голосов
/ 21 декабря 2017

Если вы хотите сосчитать все файлы в каталоге, включая файлы в подкаталогах, самый питонический способ:

import os

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

Мы используем сумму, которая быстрее, чем явное добавление количества файлов (время ожидания)

4 голосов
/ 14 апреля 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...