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() аргыг ашиглана уу. Хэрэв энэ нь файл бол stat_result объектын st_size шинж чанараас хэмжээг авна. Лавлах тохиолдолд энэ функцийг рекурсив байдлаар дуудаж, бүх хэмжээг нэмж, нийт хэмжээг буцаана.
Нэмж дурдахад, is_file() нь анхдагчаар файлуудын симбол холбоосын хувьд ҮНЭНийг буцаана. Мөн is_dir() нь лавлахуудын симбол холбоосын хувьд үнэнийг буцаана. Хэрэв та бэлгэдлийн холбоосыг үл тоомсорлохыг хүсвэл is_file() болон is_dir()-ийн follow_symlinks аргументыг худал болгож тохируулна уу.
Мөн хэрэв та дэд сангуудаар дамжих шаардлагагүй бол дараах хэсгийг устгаж болно.
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()-тай хослуулан нөхцөлт шүүлтийг ашиглана уу.
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