Как мне прочитать количество файлов в папке, используя Python? - PullRequest
9 голосов
/ 07 октября 2010

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

Ответы [ 6 ]

28 голосов
/ 07 октября 2010

Для некурсивного подсчета файлов и каталогов вы можете использовать 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])

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

6 голосов
/ 07 октября 2010

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

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

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

Это можно исправить с помощью os.path.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)
6 голосов
/ 07 октября 2010

Вы можете использовать модуль glob :

>>> 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
4 голосов
/ 15 апреля 2017

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

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

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
0 голосов
/ 10 декабря 2018

рекурсивное решение:

sum(len(fs) for _,_,fs in os.walk(os.getcwd()))

для текущего решения каталога:

len(os.walk(os.getcwd()).next()[2])
0 голосов
/ 15 апреля 2017
total = len(filter(
            lambda f: os.path.isfile(os.path.join(path_to_dir, f)),
            os.listdir(path_to_dir)))

OR

total = sum([True for f in os.listdir(path_to_dir) if os.path.isfile(os.path.join([path_to_dir, f)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...