เมื่อใช้ระบบปฏิบัติการไลบรารีมาตรฐาน 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() เป็นเท็จ
นอกจากนี้ หากคุณไม่ต้องการสำรวจไดเรกทอรีย่อย คุณสามารถลบส่วนต่อไปนี้ได้
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()
ไม่มี os.scandir() ใน Python 3.4 หรือเก่ากว่า ดังนั้นให้ใช้ 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