Как прочитать количество файлов в папке с помощью 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)])