รับขนาดของไฟล์หรือไดเร็กทอรี (โฟลเดอร์) ใน Python

ธุรกิจ

เมื่อใช้ระบบปฏิบัติการไลบรารีมาตรฐาน 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