Размер всех файлов python

Русские Блоги

[Python] Использование os.walk и получение размера всех файлов в папке

Прежде чем говорить об os.walk, давайте поможем с ipython3 и напечатаем следующим образом

Help on function walk in module os: walk(top, topdown=True, onerror=None, followlinks=False) Directory tree generator. For each directory in the directory tree rooted at top (including top itself, but excluding '.' and '..'), yields a 3-tuple,dirpath, dirnames, filenames dirpath is a string, the path to the directory. dirnames is a list of the names of the subdirectories in dirpath (excluding '.' and '..'). filenames is a list of the names of the non-directory files in dirpath. Note that the names in the lists are just names, with no path components. To get a full path (which begins with top) to a file or directory in dirpath, do os.path.join(dirpath, name). If optional arg 'topdown' is true or not specified, the triple for a directory is generated before the triples for any of its subdirectories (directories are generated top down). If topdown is false, the triple for a directory is generated after the triples for all of its subdirectories (directories are generated bottom up). 
Объявление функции выглядит следующим образом os.walk(top, topdown=True, onerror=None, followlinks=False) 

os.walk возвращает генератор. Объект, возвращаемый при каждом обходе, является кортежем, а кортеж содержит три элемента:
dirpath: путь к просматриваемой в данный момент папке, тип — строка;
dirname: имя подпапки в текущей просматриваемой папке, тип — список;
имена файлов: имена файлов в текущей просматриваемой папке, тип — список;

Описание параметра: вверху: каталог, по которому нужно пройти topdown: если topdown - True, сначала пройти через верхний каталог, а если topdown - False, сначала пройти по подкаталогам onerror: обратный вызов при ненормальном followlinks: followlinks, если true, он будет перемещаться по каталогу, на который фактически указывает ярлык в каталоге (по умолчанию закрыт) 

Создайте папку обхода, содержащую подпапки и файлы, и просмотрите структуру каталогов через дерево терминала:

walk ├── test1 │ ├── test1_1 │ │ ├── test1_1_1 │ │ └── test1_1_a.py │ ├── test1_2 │ │ └── test1_2_1 │ ├── test1_3 │ ├── test1_a.py │ └── test1_b.py ├── test2 │ ├── test2_1 │ └── test2_a.py ├── test3 └── test.py 

Мы просматриваем результат, возвращаемый os.walk (), через цикл for

import os for root, dirs, files in os.walk("/home/python/walk",True): print("root:%s"%root) print("dirs:%s"%dirs) print("files:%s"%files) print("-------------------------------") 

Результаты приведены ниже:

root:/home/python/walk dirs:['test2', 'test1', 'test3'] files:['test.py'] ------------------------------- root:/home/python/walk/test2 dirs:['test2_1'] files:['test2_a.py'] ------------------------------- root:/home/python/walk/test2/test2_1 dirs:[] files:[] ------------------------------- root:/home/python/walk/test1 dirs:['test1_2', 'test1_3', 'test1_1'] files:['test1_a.py', 'test1_b.py'] ------------------------------- root:/home/python/walk/test1/test1_2 dirs:['test1_2_1'] files:[] ------------------------------- root:/home/python/walk/test1/test1_2/test1_2_1 dirs:[] files:[] ------------------------------- root:/home/python/walk/test1/test1_3 dirs:[] files:[] ------------------------------- root:/home/python/walk/test1/test1_1 dirs:['test1_1_1'] files:['test1_1_a.py'] ------------------------------- root:/home/python/walk/test1/test1_1/test1_1_1 dirs:[] files:[] ------------------------------- root:/home/python/walk/test3 dirs:[] files:[] ------------------------------- 
* Обратите внимание, что если путь, который вам нужно пройти, является относительным путем, возвращаемый путь dirpath, то есть root, также будет относительным путем 

Используйте os.walk (), чтобы получить размер файла в папке:

import os from os.path import join,getsize def getdirsize(dir): size = 0 for root,dirs,files in os.walk(dir): size += sum([getsize(join(root,name))for name in files]) return size 

Источник

Читайте также:  Многомерный массив си шарп

jigi-33 / calculate_zise_of_directory_recursively.md

Надо посчитать размер всех файлов в подпапке, которая находится в главной папке, при этом не считать сам размер подпапки А вводить надо путь главной папки В главной папки всего 4 подпапки На экран должен выводится размер каждой подпапки отдельно Пытался что-то придумать с os.path.getsize(path) не вышло, решил потом вернусь, а время уже поджимает, можете помочь?

Для рекурсивного обхода всех подпапок есть os.walk, берите и используйте его тоже, они оба работают, я гарантирую это Найти суммарный размер всех регулярных файлов в каталоге, рекурсивно обходя все подкаталоги – подробности ниже.

import os from os.path import getsize, join """ '.' это поиск в текущей папке """ for root, dirs, files in os.walk('.'): total_size = sum(getsize(join(root, name)) for name in files) print(root, total_size)

root — это текущая папка на текущей итерации; dirs — список папок в root; files — список файлов в root; join(root, name) — объединяет путь от текущей папке к файлу в ней; getsize — вернет размер файла в байтах.

Хочу уточнить, что скрипт показывает размер файлов в папке, но не подсчитывает размер папки с учетом других папок.

Поэтому, если нужно подсчитать размер папки с учетом вложенных папок, можно попробовать такой вариант:

""" Словарь нужен чтобы помнить размер папки. Когда итератор дойдет до родительской папки в словаре уже будут размеры вложенных папок. """ dir_sizes = dict() for root, dirs, files in os.walk('.', topdown=False): size = sum(getsize(join(root, f)) for f in files) size += sum(dir_sizes[join(root, d)] for d in dirs) dir_sizes[root] = size for path, total_size in sorted(dir_sizes.items(), key=lambda x: x[0]): print(path, sizeof_fmt(total_size))

Параметр topdown=False говорит что перебор нужно делать не с корневой папки, а наоборот — с самого низа.

Если нужен размер в человеко-читаемом формате показать, можно воспользоваться функцией:

def sizeof_fmt(num): for x in ['bytes', 'KB', 'MB', 'GB']: if num  1024.0: return "%3.1f %s" % (num, x) num /= 1024.0 return "%3.1f %s" % (num, 'TB')
. print(root, sizeof_fmt(total_size))

Это работает! Тут можно и try/catch, и с аргументами walk’а followlinks и onerror поиграться.

Источник

Получение размера файла или каталога (папки) в Python

From-Locals

Используя стандартную библиотеку Python os, вы можете получить размер (емкость) файла или общий размер файлов, содержащихся в каталоге.

Ниже описаны три метода. Единицы измерения размеров, которые могут быть получены, — все байты.

  • Получить размер файла : os.path.getsize()
  • Получите размер каталога, комбинируя следующие функции (Python 3.5 или более поздняя версия) : os.scandir()
  • Объедините следующие функции, чтобы получить размер каталога (Python 3.4 и более ранние версии) : os.listdir()

Получить размер файла: os.path.getsize()

Размер (емкость) файла можно получить с помощью os.path.getsize().

В качестве аргумента укажите путь к файлу, размер которого вы хотите получить.

import os print(os.path.getsize('data/src/lena_square.png')) # 473831 

Получить размер каталога (папки): os.scandir()

Чтобы вычислить общий размер файлов, содержащихся в каталоге (папке), используйте os.scandir().

Эта функция была добавлена в Python 3.5, поэтому в более ранних версиях используется os.listdir(). Пример os.listdir() описан далее.

Определите функцию следующим образом.

def get_dir_size(path='.'): total = 0 with os.scandir(path) as it: for entry in it: if entry.is_file(): total += entry.stat().st_size elif entry.is_dir(): total += get_dir_size(entry.path) return total print(get_dir_size('data/src')) # 56130856 

os.scandir() возвращает итератор объекта os.DirEntry.

объект DirEntry, используйте методы is_file() и is_dir(), чтобы определить, является ли он файлом или каталогом. Если это файл, то размер получается из атрибута st_size объекта stat_result. В случае каталога эта функция вызывается рекурсивно, чтобы сложить все размеры и вернуть общий размер.

Кроме того, по умолчанию is_file() возвращает TRUE для символических ссылок на файлы. Также is_dir() возвращает true для символических ссылок на каталоги. Если вы хотите игнорировать символические ссылки, установите аргумент follow_symlinks в is_file() и is_dir() в false.

Также, если вам не нужно переходить по подкаталогам, вы можете просто удалить следующую часть.

 elif entry.is_dir(): total += get_dir_size(entry.path) 

Приведенная выше функция не сработает, если в качестве аргумента передан путь к файлу. Если вам нужна функция для возврата размера файла или каталога, вы можете написать следующее.

def get_size(path='.'): if os.path.isfile(path): return os.path.getsize(path) elif os.path.isdir(path): return get_dir_size(path) print(get_size('data/src')) # 56130856 print(get_size('data/src/lena_square.png')) # 473831 

Получить размер каталога (папки): os.listdir()

В Python 3.4 и более ранних версиях отсутствует os.scandir(), поэтому используйте os.listdir().

Определите функцию следующим образом.

def get_dir_size_old(path='.'): total = 0 for p in os.listdir(path): full_path = os.path.join(path, p) if os.path.isfile(full_path): total += os.path.getsize(full_path) elif os.path.isdir(full_path): total += get_dir_size_old(full_path) return total print(get_dir_size_old('data/src')) # 56130856 

Основная идея та же, что и в случае os.scandir().

Что можно получить с помощью os.listdir(), так это список имен файлов (имен каталогов). Каждое имя файла или имя каталога объединяется с путем родительского каталога с помощью os.path.join() для создания полного пути.

Если цель является символической ссылкой, os.path.isfile() и os.path.isdir() будут судить об этой сущности. Поэтому, если вы хотите игнорировать символические ссылки, используйте условное суждение в сочетании с os.path.islink(), которая возвращает true для символических ссылок.

Как и в случае с os.scandir(), если вам не нужно обходить подкаталоги, просто удалите следующую часть.

 elif os.path.isdir(full_path): total += get_dir_size_old(full_path) 

Приведенная выше функция не сработает, если в качестве аргумента передан путь к файлу. Если вам нужна функция для возврата размера файла или каталога, вы можете написать следующее.

def get_size_old(path='.'): if os.path.isfile(path): return os.path.getsize(path) elif os.path.isdir(path): return get_dir_size_old(path) print(get_size_old('data/src')) # 56130856 print(get_size_old('data/src/lena_square.png')) # 473831 

Источник

Оцените статью