Узнать количество файлов и папок в папке
Как узнать количество файлов и папок содержащихся в папке?
Plastik
uses Windows; не забываем.
Вызываем процедуру из основной программы:
ScanDirFilesW(‘c:\NVIDIA’,x1,x2);
x1 — количество папок.
x2 — количество файлов.
Процедура сканирует все вложенные папки тоже.
Игнорирует «.» и «..».
procedure ScanDirFilesW(StartPath : pWideChar;out Dirs,Files : dword);
var xDird,xFiles : dword;
procedure FirstDir1(NextPath : pWideChar);
var xPath : packed array[0..2047]of WideChar;
xData : WIN32_FIND_DATAW;xHandle : tHandle;
begin
lstrCpyW(xPath,NextPath);
if xPath[lstrLenW(xPath)-1]'\'then lstrCatW(xPath,'\');
lstrCatW(xPath,'*.*');
xHandle:=FindFirstFile(xPath,xData) ;
if xHandleINVALID_HANDLE_VALUE then begin
repeat
if(lstrCmp('.',xData.cFileName)0) and(lstrCmp('..',xData.cFileName) 0)then begin
if(xData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY>0)then begin
inc(xDird);
lstrCpyW(xPath,NextPath);lstrCatW(x Path,'\');lstrCatW(xPath,xData.cFil eName);
FirstDir1(xPath);
end else inc(xFiles);
lstrCpyW(xPath,NextPath);lstrCatW(x Path,'\');lstrCatW(xPath,xData.cFil eName);writeln(xPath);
end;
until not FindNextFile(xHandle,xData);
FindClose(xHandle);
end;
end;
begin
xDird:=0;xFiles:=0;
FirstDir1(StartPath);
Dirs:=xDird;Files:=xFiles;
end;
Случайные статьи
- Запрет кеширования конкретных файлов браузером
- Как сохранить текст из memo в папке с программой?
- Подсчет и поверка контрольной суммы CRC16
- Открыть .txt файлы по очереди и найти нужную строку
- Как вести лог ошибок в приложении?
- Проблемы с кодировкой в запросе через THTTPSend
- Посчитать количество знаков в edit
- УРОК 17. СИМВОЛЬНЫЕ СТРОКИ
- Excel: заменить слова в ячейках располагающимися под ними ссылками (в формате http://…)
- Как присвоить значение RadioButton?
Как посчитать количество объектов (файлов и папок) в папке?
Имееется ввиду использование класса Path() , но не обязательно.
Вот такое решение мне кажется громоздким. Нет ли чего-то изящнее?
Задача решалась 100500 раз, видно плохо гуглил.
from pathlib import Path folder_name = input("folder name:") folder = Path(folder_name) if folder.is_dir(): folder_count = len([1 for file in folder.iterdir()]) print(f"В папке есть объектов")
Отслеживать
51.6k 200 200 золотых знаков 61 61 серебряный знак 242 242 бронзовых знака
Посчитать количество файлов определенного типа в заданной папке. Python
Ты никогда не знаешь, сколько файлов нужно пересчитать в папке, пока не столкнешься с этой задачей. Но теперь ты можешь облегчить свою работу с помощью нашей нейросети онлайн, которая самостоятельно посчитает количество файлов нужного типа в заданной папке. Больше не нужно тратить время на рутинные задачи — нейросеть пишет текст, а ты можешь заниматься своим творчеством. Попробуй прямо сейчас, и ты убедишься, насколько просто и удобно это.
Создать текст по запросам:
Статья Получение размера директории с помощью Python
Эта небольшая заметка предназначена скорее для тех, кто только начинает осваивать python. Речь в ней пойдет о том, как узнать размер папки. Для тех же, кто уже давно программирует, данная информация, скорее всего, будет уже известна.
Чтобы не ходить очень далеко, возьму пример из собственного опыта. Мне потребовалось узнать размер директории. Я был немного удивлен, когда узнал, что размер нельзя получить, просто запросив os.stat(‘путь к директории’).st_size. Вернее можно, вот только возвращался стабильно одинаковый результат – 4 килобайта. Можете сами убедиться на примере. Ниже представлен небольшой скрипт, в котором, указав путь к директории (именно к директории, а не файлу), вы получите ее размер.
import os def get_size(bts, ending='B'): for item in ["", "K", "M", "G", "T", "P"]: if bts < 1024: return f"" bts /= 1024 print(get_size(os.stat(input("Введите путь к директории: ")).st_size))
Тогда я подумал, потом еще немного и попытался разобраться. Получается, что даже если вы попробуете узнать размер папки с помощью контекстного меню папки, выбрав «Свойства», результат вы получите не сразу. Пройдет некоторое время, которое будет напрямую зависеть от количества файлов, скорости жесткого диска и прочих параметров, прежде чем вы получите размер.
Подсчет размера директории в Windows
То есть, происходит считывание размера каждого файла, находящегося во всех папках, которые есть в данном расположении. Тогда я сделал небольшой скрипт, который помог на тот момент получить размер директории. Он работает как в Windows, так и в Linux и, думаю, что для большинства задач его вполне хватит.
Здесь мы создали функцию get_size, которая будет получать размер в байтах, а возвращать уже приведенное к одному из измерений размере. Ну и функция volume, в которую передается путь к директории, с помощью функции os.walk обходятся рекурсивно все директории. Затем в каждой директории, если там есть файлы, получаем их размер и суммируем в переменной size. После чего возвращаем ее из функции.
Скрипт для подсчета размера директории
import sys from os import walk from pathlib import Path def get_size(bts, ending='B'): for item in ["", "K", "M", "G", "T", "P"]: if bts < 1024: return f"" bts /= 1024 def volume(path_dir): size = 0 for path, dirs, files in walk(path_dir): for file in files: size += (Path(path) / file).stat().st_size return size def main(): path = input("Введите путь к директории: ") if not Path(path).exists() or not Path(path).is_dir() or not path: print("Указанного пути не существует или введенный путь не является директорией.") sys.exit(0) print(get_size(volume(path))) if __name__ == "__main__": main()
Если же нужно немного больше, давайте сделаем скрипт, предназначение которого и будет заключаться в том, чтобы возвращать размер директории, количество папок и файлов в ней.
Импорт библиотек
Для начала импортируем нужные для работы скрипта библиотеки. Сторонних библиотек устанавливать не требуется, поэтому пишем:
import os import sys from pathlib import Path
Создание и инициализация класса
Создадим класс Size. При инициализации класса объявим три переменных. В переменной self.volume будет храниться общий объем указанной директории. В переменной self.count_files – будем хранить количество файлов в директории, а в переменной self.count_dirs – количество папок.
class Size: def __init__(self): self.volume = 0 self.count_files = 0 self.count_dirs = 0
Создадим функцию класса get_size(bts, ending='B'), которая будет являться больше вспомогательной, поэтому, сделаем ее статической. С ней, если вы смотрели предыдущий код, вы уже должны быть знакомы. Она занимается тем, что переводит байты в большие размеры.
@staticmethod def get_size(bts, ending='B'): for item in ["", "K", "M", "G", "T", "P"]: if bts < 1024: return f"" bts /= 1024
Создадим функцию def counting(self, size). На входе она принимает размер файла и добавляет его к общему размеру self.volume. Также, здесь выводиться в терминал информация о процессе сканирования. Поэтому, если вывод данной информации не требуется, эту строку можно просто закомментировать.
def counting(self, size): self.volume += size print(f'\r total, directories and ' f'files. ', end='')
Теперь создадим функцию def size_recurse(self, path), в которую будет передаваться путь к сканируемой директории. С помощью функции os.scandir получаем информацию о файлах и папках, которые находятся в целевой директории. Данная функция используется потому, что она возвращает итератор entry_it объектов os.DirEntry. В данном случае мы немного повышаем производительность нашего скрипта, так как объекты os.DirEntry предоставляют информацию о типе или атрибуте файла, если эту информацию предоставляет операционная система, а значит, нам не нужно делать дополнительный запрос, который эту информацию бы получал. В цикле итерируемся по полученным объектам, проверяем, не является ли объект директорией. Если нет, увеличиваем счетчик файлов. Считываем размер файла и передаем в функцию counting для добавления в общий размер и вывода информации в терминал. Если же получить размер файла не удается, а такое вполне может произойти, просто продолжаем итерацию.
Если же объект является директорией, увеличиваем счетчик директорий, передаем размер объекта в функцию counting для добавления. Как вы помните, размер директории в чистом виде равен 4 килобайтам. И рекурсивно запускаем функцию size_recurse, в которую передаем директорию для сканирования. После завершения всех итераций возвращаем из класса общий объем директории в байтах. Так сделано для того, чтобы можно было использовать этот объем в чистом виде.
def size_recurse(self, path): try: for file in os.scandir(path): if not file.is_dir(follow_symlinks=False): self.count_files += 1 try: self.counting(file.stat().st_size) except: continue else: self.count_dirs += 1 self.counting(file.stat(follow_symlinks=False).st_size) self.size_recurse(file.path) return self.volume except OSError: pass
Ну и еще, сделаем наш скрипт запускаемым из командной строки. Для этого я сделал небольшой код, который получает все аргументы из командной строки. А передать в нее в качестве аргумента мы должны путь к директории, размер которой требуется узнать. Сделано это для того, чтобы, если попадется пробел в имени директории, можно было свести все аргументы вместе и передать полный путь в класс, для получения размера. Что мы и делаем. Итерируемся по всем аргументам. Я сделал их количество 100. Думаю, что вряд ли кто-то передаст в качестве параметра путь, в котором сто пробелов. И добавляем каждый найденный аргумент в список. После того, как срабатывает исключение, объединяем список, проверяем, не является ли получившийся путь пустым. Если нет, проверяем, существует ли переданный путь, является ли переданный путь директорией. И если да, передаем полученный путь в функцию класса, для получения размера. Ну, а если не выполняется какое-либо из условий, сообщаем об этом пользователю.
if __name__ == "__main__": path_arg = [] try: for i in range(1, 101): if sys.argv[i]: path_arg.append(sys.argv[i]) except IndexError: path_arg = " ".join(path_arg) if path_arg: if Path(path_arg).exists() and Path(path_arg).is_dir(): path_vol = Size().size_recurse(path_arg) print(f'\n bytes total') else: print("Директории не существует") else: print(f"Укажите путь к директории!\nПример:\n volume.py \n volume.py G:\n volume.py /home")
Вот пример работы скрипта. Попробуем узнать объем целого диска.