from os import stat, path, walk, listdir
from sys import exit as ex
def correct_size(bts: int, ending='iB') -> str:
"""
Корректируется размер файла.
:param bts: размер файла, целое число.
:param ending: суффикс, добавляемый к метрике.
:return: строка, корректированный размер файла.
"""
size = 1024
for item in ["", "K", "M", "G", "T", "P"]:
if bts < size:
return f"{bts:.2f} {item}{ending}"
bts /= size
def folder_scan(path_dir: str) -> str:
"""
Определение размера директории. Сканируется директория.
Определяется размер каждого файла находящегося в ней.
Суммируется в общей переменной. После завершения сканирования
возвращается скорректированный размер.
:param path_dir: строка, путь к директории для сканирования.
:return: строка, скорректированный размер файла.
"""
file_size = stat(path_dir).st_size
for root, dirs, files in walk(path_dir):
for file in files:
file_size = file_size + stat(path.join(root, file)).st_size
return correct_size(file_size)
def list_dir(path_dir: str):
"""
Сканирование директории. Определение размера файлов и папок.
Добавление данных об имени и размере в текстовый документ.
Сортировка полученных объектов на файлы и папки в процессе
итерации по ним. Если файл, определяем размер сразу. Если папка,
передаем путь к ней в функцию получения размера папки.
:param path_dir: строка, путь к директории для сканирования.
"""
rez = sorted(listdir(path_dir))
with open("out_ok.txt", "w") as file:
for n, item in enumerate(rez):
if path.isdir(path.join(path_dir, item)):
size = folder_scan(path.join(path_dir, item))
else:
size = correct_size(stat(path.join(path_dir, item)).st_size)
file.write(f"{n + 1} {item} - {size}\n")
print('Список файлов смотрим здесь - out_ok.txt ')
def main():
"""
Запрос у пользователя пути к сканируемой директории.
Запуск функции сканирования с передачей в нее
полученного от пользователя пути.
"""
path_dir = input("Введите путь к сканируемой директории: ")
if not path.exists(path_dir):
print("Введенной вами директории не существует.")
ex(0)
list_dir(path_dir)
if __name__ == "__main__":
main()