Λήψη του μεγέθους ενός αρχείου ή ενός καταλόγου (φακέλου) στην Python

Επιχείρηση

Χρησιμοποιώντας την τυπική βιβλιοθήκη os της Python, μπορείτε να λάβετε το μέγεθος (χωρητικότητα) ενός αρχείου ή το συνολικό μέγεθος των αρχείων που περιέχονται σε έναν κατάλογο.

Εξηγούνται οι ακόλουθες τρεις μέθοδοι. Οι μονάδες των μεγεθών που μπορούν να ληφθούν είναι όλα bytes.

  • Λάβετε το μέγεθος του αρχείου: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()

Δεν υπάρχει η 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(), η οποία επιστρέφει 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
Copied title and URL