Используя стандартную библиотеку 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