С помощта на стандартната библиотека на 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