Як підрахувати кількість файлів у каталозі за допомогою Python


224

Мені потрібно порахувати кількість файлів у каталозі за допомогою Python.

Я думаю, найпростіший спосіб len(glob.glob('*')), але це також зараховує сам каталог як файл.

Чи є спосіб підрахувати лише файли в каталозі?


Щоб залишити каталоги, ви можете зробити "* .fileextension" для будь-якого розширення файлу, яке ви шукаєте.

Відповіді:


275

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/…
Рафаель Олівейра

1
Це не зараховує файл всередині вкладених папок.
codersofthedark

5
Для рекурсивного підрахунку файлів, що вкладаються всередині каталогів, вам може бути краще рішення os.walk ().
Джоель Б

Яка вигода від використання os.path.join(DIR, name)більш DIR + '/' + name? Останній коротший і, ІМО, більш чіткий, ніж перший. Можливо, є якась ОС: ес, на якій остання не вийшла?
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)

Це не рекурсивно
Кайл Бріденстін

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

Якщо ви хочете порахувати всі файли в каталозі, включаючи файли в підкаталогах, найбільш пітонічним способом є:

import os

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

Ми використовуємо суму, яка швидша, ніж явне додавання підрахунків файлів (очікує терміни)


1
Привіт, я намагався зрозуміти цей код (код працює ідеально), я знаю, що ми можемо використовувати _в forциклі. os.walkтакож я знаю. Але не впевнений, що відбувається з підкресленнями всередині sumфункції. Дякую!
Еджаз

1
Unsderscore - це лише ім'я змінної @Ejaz, за умовою, що використовується, коли ми ігноруємо змінну - саме це ми робимо тут - ми називаємо ходьбу і підраховуємо лише кількість файлів у кожному каталозі, ігноруючи повернені значення root та dirs, повертаючи значення
Mr_and_Mrs_D


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

9

Я здивований, що ніхто не згадав 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())

Розбір результатів, lsяк правило, нахмурився (це часто може спричинити проблеми), хоча це не поганий "швидкий і брудний" метод в оболонці. Ви повинні використовувати ls -1, хоча це гарантує один рядок на файл.
Кривавий обмін

3

Хоча я згоден з відповіддю, наданою @DanielStutzbach: os.listdir()буде дещо ефективнішим, ніж використання glob.glob.

Однак, ви хочете використовувати додаткову точність, якщо ви хочете порахувати кількість певних файлів у папці len(glob.glob()). Наприклад, якщо ви мали б порахувати всі pdfs у папці, яку ви хочете використовувати:

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

2

Це просто:

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

він просто підраховує кількість файлів у каталозі, я використовував техніку розуміння списку, щоб повторити через певний каталог, повертаючи всі файли взамін. "len (повернений список)" повертає кількість файлів.


1
Ласкаво просимо до переповнення стека. Якість цієї відповіді можна покращити, додавши пояснення: Як відповісти
Elletlar

1
Дякую Еллетлар, я відредагував свою відповідь, я обов’язково відповім більш вичерпно: D
Ага Саад

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)

ОП запитувала кількість файлів , у цьому списку також є каталоги.
Корем

1

Якщо ви будете використовувати стандартну оболонку операційної системи, ви можете отримати результат набагато швидше, ніж використовувати чистий пітонічний спосіб.

Приклад для 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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.