Lấy kích thước của một tệp hoặc thư mục (thư mục) bằng Python

Kinh doanh

Sử dụng hệ điều hành thư viện chuẩn Python, bạn có thể nhận được kích thước (dung lượng) của một tệp hoặc tổng kích thước của các tệp có trong một thư mục.

Ba phương pháp sau đây được giải thích. Đơn vị của kích thước có thể nhận được là tất cả các byte.

  • Nhận kích thước của tệp:os.path.getsize()
  • Nhận kích thước của một thư mục bằng cách kết hợp các hàm sau (Python 3.5 trở lên):os.scandir()
  • Kết hợp các hàm sau để lấy kích thước của thư mục (Python 3.4 trở về trước):os.listdir()

Nhận kích thước của tệp:os.path.getsize()

Kích thước (dung lượng) của tệp có thể được lấy bằng os.path.getsize ().

Cung cấp đường dẫn của tệp có kích thước bạn muốn lấy làm đối số.

import os

print(os.path.getsize('data/src/lena_square.png'))
# 473831

Nhận kích thước của một thư mục (thư mục):os.scandir()

Để tính tổng kích thước của các tệp chứa trong một thư mục (thư mục), hãy sử dụng os.scandir ().

Hàm này đã được thêm vào trong Python 3.5, vì vậy các phiên bản trước sử dụng os.listdir (). Ví dụ os.listdir () được mô tả sau.

Xác định một chức năng như sau.

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 () trả về một trình lặp của đối tượng os.DirEntry.

Đối tượng DirEntry, sử dụng các phương thức is_file () và is_dir () để xác định xem nó là một tệp hay một thư mục. Nếu nó là một tệp, kích thước được lấy từ thuộc tính st_size của đối tượng stat_result. Trong trường hợp là một thư mục, hàm này được gọi đệ quy để cộng tất cả các kích thước và trả về tổng kích thước.

Ngoài ra, theo mặc định, is_file () trả về TRUE cho các liên kết tượng trưng đến tệp. Ngoài ra, is_dir () trả về true cho các liên kết tượng trưng đến các thư mục. Nếu bạn muốn bỏ qua các liên kết tượng trưng, ​​hãy đặt đối số follow_symlinks của is_file () và is_dir () thành false.

Ngoài ra, nếu bạn không cần duyệt qua các thư mục con, bạn có thể xóa phần sau.

            elif entry.is_dir():
                total += get_dir_size(entry.path)

Hàm trên sẽ không thành công nếu đường dẫn của tệp được truyền dưới dạng đối số. Nếu bạn cần một hàm để trả về kích thước của một tệp hoặc một thư mục, bạn có thể viết như sau.

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

Nhận kích thước của một thư mục (thư mục):os.listdir()

Không có os.scandir () trong Python 3.4 hoặc phiên bản cũ hơn, vì vậy hãy sử dụng os.listdir ().

Xác định một chức năng như sau.

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

Ý tưởng cơ bản giống như trong trường hợp của os.scandir ().

Những gì có thể nhận được với os.listdir () là một danh sách các tên tệp (tên thư mục). Mỗi tên tệp hoặc tên thư mục được nối với đường dẫn của thư mục mẹ với os.path.join () để tạo đường dẫn đầy đủ.

Nếu đích là một liên kết tượng trưng, ​​os.path.isfile () và os.path.isdir () sẽ đánh giá thực thể. Vì vậy, nếu bạn muốn bỏ qua các liên kết tượng trưng, ​​hãy sử dụng phán đoán có điều kiện kết hợp với os.path.islink (), trả về true cho các liên kết tượng trưng.

Như trong trường hợp của os.scandir (), nếu bạn không cần duyệt qua các thư mục con, chỉ cần xóa phần sau.

        elif os.path.isdir(full_path):
            total += get_dir_size_old(full_path)

Hàm trên sẽ không thành công nếu đường dẫn của tệp được truyền dưới dạng đối số. Nếu bạn cần một hàm để trả về kích thước của một tệp hoặc một thư mục, bạn có thể viết như sau.

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
Copied title and URL