Χρησιμοποιώντας την τυπική βιβλιοθήκη 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