Використовуючи OS стандартної бібліотеки Python, ви можете отримати розмір (ємність) файлу або загальний розмір файлів, що містяться в каталозі.
Пояснюються наступні три методи. Усі одиниці розмірів, які можна отримати, є байтами.
- Отримайте розмір файлу:
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