Как прочитать количество файлов в папке с помощью Python?

Как прочитать количество файлов в определенной папке с помощью Python? Пример кода был бы потрясающим!

5 ответов


для подсчета файлов и каталогов нерекурсивно вы можете использовать os.listdir и возьмите его длину.

для рекурсивного подсчета файлов и каталогов вы можете использовать os.walk для перебора файлов и подкаталогов в каталоге.

если вы хотите только считать файлы, а не каталоги, которые вы можете использовать os.listdir и os.path.file чтобы проверить, является ли каждая запись файлом:

import os.path
path = '.'
num_files = len([f for f in os.listdir(path)
                if os.path.isfile(os.path.join(path, f))])

или с помощью генератор:

num_files = sum(os.path.isfile(os.path.join(path, f)) for f in os.listdir(path))

или вы можете использовать os.walk следующим образом:

len(os.walk(path).next()[2])

я нашел некоторые из этих идей от этой теме.


можно использовать Глоб модуль:

>>> import glob
>>> print len(glob.glob('/tmp/*'))
10

или, как предлагает Марк Байерс в своем ответе, если вы хотите только файлы:

>>> print [f for f in glob.glob('/tmp/*') if os.path.isfile(f)]
['/tmp/foo']
>>> print sum(os.path.isfile(f) for f in glob.glob('/tmp/*'))
1

ответ Марка Байера прост, элегантен и соответствует духу python.

есть проблема, однако: если вы попытаетесь запустить это для любого другого каталога, кроме".", он потерпит неудачу, так как ОС.listdir() возвращает имена файлов, а не полный путь. Эти два совпадают при перечислении текущего рабочего каталога, поэтому ошибка остается незамеченной в источнике выше.

например, если ваш в "/ home / me "и вы перечислите "/ tmp", вы получите (скажем) ['flashXVA67']. Вы будете тестировать "/home/me/flashXVA67" вместо "/tmp/flashXVA67" с помощью метода выше.

Вы можете исправить это с помощью ОС.путь.join (), например:

import os.path
path = './whatever'
count = len([f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))])

кроме того, если вы собираетесь делать это количество много и требуют производительности, вы можете сделать это без создания дополнительных списков. Вот менее элегантное, непитонеское, но эффективное решение:

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


# The following line prints the number of files in the current directory:
path = "./whatever"
print fcount(path)

pathlib, что является новым в ст. 3.4, делает как проще. Линия с надписью 1 создает нерекурсивный список текущей папки с надписью 2 рекурсивного списка.

from pathlib import Path

import os
os.chdir('c:/utilities')

print (len(list(Path('.').glob('*')))) ## 1
print (len(list(Path('.').glob('**/*')))) ## 2

есть и другие лакомства. С помощью этих дополнительных строк вы можете увидеть как абсолютные, так и относительные имена файлов для тех элементов, которые are файлы.

for item in Path('.').glob('*'):
    if item.is_file():
        print (str(item), str(item.absolute()))

результат:

boxee.py c:\utilities\boxee.py
boxee_user_catalog.sqlite c:\utilities\boxee_user_catalog.sqlite
find RSS.py c:\utilities\find RSS.py
MyVideos34.sqlite c:\utilities\MyVideos34.sqlite
newsletter-1 c:\utilities\newsletter-1
notes.txt c:\utilities\notes.txt
README c:\utilities\README
saveHighlighted.ahk c:\utilities\saveHighlighted.ahk
saveHighlighted.ahk.bak c:\utilities\saveHighlighted.ahk.bak
temp.htm c:\utilities\temp.htm
to_csv.py c:\utilities\to_csv.py

total = len(filter(
            lambda f: os.path.isfile(os.path.join(path_to_dir, f)),
            os.listdir(path_to_dir)))

или

total = sum([True for f in os.listdir(path_to_dir) if os.path.isfile(os.path.join([path_to_dir, f)])