Πώς να ελέγξετε το μέγεθος αρχείου και φακέλου στην Python;

Σε αυτό το άρθρο, θα μάθετε να ελέγχετε το μέγεθος ενός αρχείου ή φακέλου στην Python

Η Python είναι μια από τις πιο ευέλικτες γλώσσες προγραμματισμού. Με αυτό, θα μπορείτε να δημιουργήσετε από ένα μικρό πρόγραμμα CLI (Διασύνδεση γραμμής εντολών) σε μια πολύπλοκη εφαρμογή Ιστού.

Ωστόσο, ένα από τα πιο υποτιμημένα χαρακτηριστικά του είναι η ικανότητα αλληλεπίδρασης με λειτουργικά συστήματα. Η διαχείριση λειτουργιών του λειτουργικού συστήματος με την Python μπορεί να σας εξοικονομήσει τόνους χρόνου κατά τη δημιουργία διαδικασιών αυτοματισμού.

Ας δούμε πώς αλληλεπιδρά η Python με το λειτουργικό σύστημα.

Πώς αλληλεπιδρά η Python με το λειτουργικό σύστημα;

Κανείς δεν μπορεί να ζει απομονωμένος από το περιβάλλον του. Αυτό ισχύει επίσης στην Python, όπου μερικές φορές είναι θεμελιώδες να αλληλεπιδράσετε με το λειτουργικό σύστημα για να ολοκληρώσετε τα πράγματα.

Η Python έχει αρκετές ενότητες που μας επιτρέπουν να αλληλεπιδράσουμε με το λειτουργικό σύστημα. Τα πιο χρησιμοποιούμενα είναι τα os, sys, pathlib και subprocess.

Δεδομένου ότι είναι ενσωματωμένες μονάδες, δεν θα χρειαστεί να τις εγκαταστήσετε με PIP. Μπορείτε να τα εισαγάγετε όλα με την ακόλουθη δήλωση:

import os
import sys
import pathlib
import subprocess

Η παρακάτω λίστα υποδεικνύει την κύρια λειτουργικότητα καθεμιάς από αυτές τις εισαγωγές:

  • Os: Φορητός τρόπος χρήσης της λειτουργικότητας του συστήματος (Ανάλογα με το λειτουργικό σας σύστημα). Είναι η σωστή επιλογή στις περισσότερες περιπτώσεις εκτός και αν χρειάζεστε κάτι πιο εξελιγμένο
  • Sys: Παράμετροι και συναρτήσεις για το σύστημα. Αυτή η ενότητα παρέχει πρόσβαση σε μεταβλητές και συναρτήσεις διερμηνέα. Η ενότητα os αλληλεπιδρά με το λειτουργικό σύστημα και το sys αλληλεπιδρά με τον διερμηνέα Python
  • Pathlib: Προηγμένη χρήση διαδρομής. Σας επιτρέπει να αναπαριστάτε συστήματα αρχείων ως αντικείμενα, με τη σχετική σημασιολογία για κάθε λειτουργικό σύστημα.
  • Υποδιεργασία: Εκτέλεση και διαχείριση υποδιεργασιών απευθείας από την Python. Αυτό περιλαμβάνει εργασία με τους κωδικούς stdin, stdout και επιστροφής. Μπορείτε να μάθετε περισσότερα σχετικά με αυτό διαβάζοντας τον οδηγό υποδιαδικασίας Python.

Υπάρχουν βιβλιοθήκες υψηλού επιπέδου που περιλαμβάνουν ακόμη πιο συγκεκριμένη λειτουργικότητα ανάλογα με τις ανάγκες σας. Ωστόσο, τις περισσότερες φορές είστε έτοιμοι να χρησιμοποιήσετε τις παραπάνω ενότητες.

Σημείωση: Οι περισσότερες από τις λειτουργίες που παρέχονται από αυτές τις μονάδες θα έχουν διαφορετική έξοδο ανάλογα με το λειτουργικό σας σύστημα. Να θυμάστε ότι συνήθως, το καλύτερο ταίρι είναι UNIX και Python.

  Πώς να αναδιαμορφώσετε τους πίνακες NumPy στην Python

Τώρα έχετε μια γρήγορη κατανόηση του τρόπου με τον οποίο η Python αλληλεπιδρά με το λειτουργικό σύστημα, ας μεταβούμε στις μεθόδους ελέγχου του μεγέθους αρχείου και φακέλου. Όλες οι παρακάτω λύσεις είναι διαθέσιμες στο Μέγεθος αρχείου και φακέλου στην Python Αποθετήριο GitHub

Χρησιμοποιώντας το os.stat().st_size

Σε αυτή τη μέθοδο, θα χρησιμοποιήσουμε το stat() λειτουργία από τη μονάδα os. Επιστρέφει πολλές πληροφορίες για μια συγκεκριμένη διαδρομή.

Σημείωση: Η συνάρτηση os.path.getsize() κάνει επίσης τη δουλειά. Το πλεονέκτημα της χρήσης os.stat().st_size είναι ότι δεν ακολουθεί simlinks.

Πριν συνεχίσουμε, ας δημιουργήσουμε ένα αρχείο δοκιμής με το όνομα lorem.txt, στο οποίο θα επικολλήσουμε λίγο ανόητο κείμενο. Μπορούμε να επισκεφτούμε α Δημιουργία κειμένου Lorem Ipsum και επικολλήστε το κείμενο στο αρχείο lorem.txt.

Στον ίδιο κατάλογο, δημιουργήστε ένα αρχείο με το όνομα method1.py και επικολλήστε τον παρακάτω κώδικα:

import os
size = os.stat('lorem.txt').st_size
print(size)

Ας αναλύσουμε τι κάνουμε με αυτόν τον κώδικα:

  • Στην πρώτη γραμμή, εισάγουμε τη μονάδα os
  • Η μεταβλητή μεγέθους περιέχει το μέγεθος του αρχείου lorem.txt
    • Η συνάρτηση os.stat() επιστρέφει μια δέσμη πληροφοριών που σχετίζονται με το αρχείο
    • Το χαρακτηριστικό st_size αντιπροσωπεύει το μέγεθος του αρχείου
  • Εκτυπώνουμε τη μεταβλητή μεγέθους

Προσπαθήστε να εκτελέσετε το σενάριο Python. Θα λάβετε διαφορετικό αποτέλεσμα ανάλογα με το περιεχόμενο του αρχείου lorem.txt.

Παραγωγή:

20064

Η έξοδος αναπαρίσταται σε byte. Αυτό δεν είναι καθόλου αναγνώσιμο, οπότε ας το εξανθρωπίσουμε ώστε να έχουμε μια καλύτερη προοπτική του μεγέθους του αρχείου.

Πρώτα, εγκαταστήστε το εξανθρωπίζω πακέτο, εκτελώντας την ακόλουθη εντολή στο κέλυφός σας:

pip install humanize

Στη συνέχεια, μπορείτε να χρησιμοποιήσετε τη συνάρτηση naturalsize() που μετατρέπει μια τιμή σε byte σε αναγνώσιμο μέγεθος αρχείου, για παράδειγμα, KB, MB, GB ή TB.

import os
from humanize import naturalsize

size = os.stat('lorem.txt').st_size

print(size)
print(naturalsize(size))

Αρχικά, ο παραπάνω κώδικας εκτυπώνει το μέγεθος του αρχείου σε byte και στη συνέχεια εκτυπώνει το αποτέλεσμα σε αναγνώσιμο μέγεθος.

Παραγωγή:

20064
20.1 kB

Χρήση Pathlib

Παρόλο pathlib έχει σχεδιαστεί για να λειτουργεί αποκλειστικά με μονοπάτια, ενσωματώνει ορισμένες χρήσιμες λειτουργίες από άλλες ενότητες ως μεθόδους αντικειμένων διαδρομής (Περιπτώσεις της κλάσης Path).

Δημιουργήστε ένα αρχείο method2.py και εισαγάγετε το Κατηγορία διαδρομής.

from pathlib import Path

Στη συνέχεια, δημιουργήστε ένα αντικείμενο Path μεταβιβάζοντας τη διαδρομή στο αρχείο lorem.txt ως όρισμα.

file_ = Path('lorem.txt')

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

print(file_.stat().st_size)

Παραγωγή:

20064

Όπως μπορείτε να δείτε, είχαμε το ίδιο αποτέλεσμα με την πρώτη μέθοδο που χρησιμοποιήσαμε. Το παραπάνω αποτέλεσμα εκτυπώνεται επίσης σε μορφή byte, ώστε να μπορούμε να χρησιμοποιήσουμε τη μονάδα εξανθρωπισμού για να το κάνουμε αναγνώσιμο.

from pathlib import Path
from humanize import naturalsize

size = Path('lorem.txt').stat().st_size

print(naturalsize(size))

Αυτός ο κώδικας παράγει την ακόλουθη έξοδο:

20.1 kB

Χρήση εντολών Unix με Subprocess:

Η ενότητα υποδιεργασίας, μας επιτρέπει να καλούμε και να διαχειριζόμαστε υποδιεργασία από την Python. Επομένως, μπορούμε να εκτελέσουμε οποιαδήποτε εντολή και να επεξεργαστούμε την έξοδο της απευθείας στην Python.

  Είναι Κώδικας ή Κείμενο; Μάθετε με το API εντοπισμού κώδικα

Σημείωση: Αυτή η μέθοδος λειτουργεί μόνο εάν εκτελείτε λειτουργικό σύστημα Unix (Linux, Mac)

Ανοίξτε ένα αρχείο method3.py και επικολλήστε τον παρακάτω κώδικα:

from subprocess import run

process = run(['du', 'lorem.txt'], capture_output=True, text=True)

print(process.stdout)

Βουτιά σε αυτό το κομμάτι κώδικα:

  • Εισάγουμε το λειτουργία εκτέλεσης από τη μονάδα υποδιεργασίας
  • Η διαδικασία μεταβλητής περιέχει το αποτέλεσμα της εκτέλεσης της εντολής du lorem.txt
    • Το du είναι ένα βοηθητικό πρόγραμμα Linux που μας επιτρέπει να πάρουμε το χώρο στο δίσκο ενός αρχείου
    • Το capture_output μας δίνει πρόσβαση στο χαρακτηριστικό standout (standard output).
    • κείμενο σημαίνει ότι αποθηκεύουμε την έξοδο ως συμβολοσειρά αντί για byte
  • Εκτυπώνουμε την τυπική έξοδο της διαδικασίας

Εάν εκτελέσετε τον παραπάνω κώδικα, θα λάβετε την ακόλουθη έξοδο:

20      lorem.txt

Όπως μπορείτε να δείτε, μας δίνει το μέγεθος και το όνομα του αρχείου. Εάν θέλετε να λάβετε μόνο το μέγεθος του αρχείου, θα χρειαστεί να χωρίσετε την έξοδο (θυμηθείτε ότι είναι μια συμβολοσειρά) και να εκτυπώσετε το πρώτο στοιχείο.

from subprocess import run

process = run(['du', 'lorem.txt'], capture_output=True, text=True)

size = process.stdout.split()[0]

print(size)

Παραγωγή:

20

Αυτή η έξοδος δεν είναι καθόλου αναγνώσιμη. Μπορούμε να συμπεράνουμε ότι η μονάδα μέτρησης που χρησιμοποιείται είναι KB (λόγω των προηγούμενων μεθόδων), αλλά κανείς άλλος δεν μπορούσε να μαντέψει το μέγεθος του αρχείου.

Για να λύσουμε αυτό το πρόβλημα, μπορούμε να χρησιμοποιήσουμε τη σημαία -h (αναγνώσιμη από τον άνθρωπο).

Σημείωση: Μπορείτε να λάβετε ένα εγχειρίδιο αυτής της εντολής εκτελώντας το man du ή το du –help.

from subprocess import run

process = run(['du', '-h', 'lorem.txt'], capture_output=True, text=True)

size = process.stdout.split()[0]

print(size)

Τώρα η έξοδος αυτού του σεναρίου θα είναι πολύ πιο ευανάγνωστη:

20K

Εάν θέλετε να μάθετε περισσότερα σχετικά με τη λειτουργική μονάδα υποδιεργασίας και τις πιθανές εφαρμογές, ανατρέξτε στον οδηγό υποδιαδικασίας Python.

Λάβετε το μέγεθος ενός φακέλου αναδρομικά

Εάν θέλετε να αποκτήσετε το μέγεθος ενός φακέλου, θα χρειαστεί να κάνετε επανάληψη σε κάθε αρχείο που υπάρχει στον κατάλογο και στους υποκαταλόγους του. Θα το κάνουμε με δύο τρόπους:

  • Επανάληψη σε μια διαδρομή με pathlib
  • Χρησιμοποιώντας την εντολή du με υποδιεργασία

Ο παρακάτω κώδικας θα χρησιμοποιεί μια διαδρομή προς έναν δοκιμαστικό κατάλογο μέσα στον αρχικό μου φάκελο. Θα χρειαστεί να αντικαταστήσετε τη διαδρομή αυτού του αρχείου για τον κατάλογο που θέλετε να λάβετε το μέγεθος.

  Πώς να απενεργοποιήσετε το MMGuardian χωρίς να το γνωρίζουν οι γονείς

Επανάληψη σε μια διαδρομή με pathlib

Ας δούμε πώς μπορείτε να λάβετε το μέγεθος ενός καταλόγου επαναλαμβάνοντας τα μεγέθη των αρχείων.

from pathlib import Path
from humanize import naturalsize

def get_size(path="."):
    size = 0

    for file_ in Path(path).rglob('*'):

        size += file_.stat().st_size
    
    return naturalsize(size)

test_path = Path.home() / 'Documents/tests/'

print(get_size(test_path))

Αυτό το κομμάτι κώδικα φαίνεται λίγο τρομακτικό, ας αναλύσουμε τι κάνει κάθε μέρος.

  • Εισαγάγετε την κλάση Path και τη συνάρτηση naturalsize().
  • Καθορίστε τη συνάρτηση get_size() με μια διαδρομή παραμέτρου, η οποία οδηγεί στον τρέχοντα κατάλογο από προεπιλογή.
  • Η μεταβλητή μεγέθους είναι απλώς ένα σύμβολο κράτησης θέσης στο οποίο θα προσθέτουμε το μέγεθος κάθε αρχείου
  • Επανάληψη σε κάθε αρχείο της διαδρομής
  • Λάβετε το μέγεθος κάθε αρχείου και προσθέστε το στη μεταβλητή μεγέθους
  • Επιστρέφει τη μεταβλητή μεγέθους με τρόπο αναγνώσιμο από τον άνθρωπο

Φυσικά, δοκιμάζω τη λειτουργία με έναν κατάλογο διαθέσιμο μόνο στο μηχάνημά μου. Μην ξεχάσετε να αλλάξετε τη διαδρομή σε έναν φάκελο που υπάρχει στον υπολογιστή σας.

Στην περίπτωσή μου, λαμβάνω την ακόλουθη έξοδο:

403.4 MB

Χρήση του du Command με Υποδιεργασία

Αυτή η προσέγγιση έχει ορισμένα πλεονεκτήματα:

  • Το αποτέλεσμα είναι λίγο πιο ακριβές
  • Είναι πολύ πιο γρήγορο
from subprocess import run
from pathlib import Path

test_path = Path.home() / 'Documents/tests/'

process = run(['du', '-sh', test_path], capture_output=True, text=True)

size = process.stdout.split()[0]

print(size)

Χρησιμοποιούμε την ίδια προσέγγιση με τη μέθοδο 3, αλλά αυτή τη φορά παίρνουμε το μέγεθος ενός καταλόγου αντί για ένα αρχείο.

Παραγωγή:

481M

Όπως μπορείτε να δείτε αυτοί οι δύο τρόποι για να λάβετε το μέγεθος ενός φακέλου, επιστρέφει ένα ελαφρώς διαφορετικό αποτέλεσμα. Όσο μεγαλύτερος είναι ο κατάλογος τόσο μεγαλύτερη διαφορά θα έχετε.

Εναπόκειται σε εσάς να επιλέξετε μεταξύ των προσεγγίσεων pathlib ή υποδιαδικασίας. Εάν γνωρίζετε ότι θα χρησιμοποιείτε Linux κάθε φορά που χρησιμοποιείτε υποδιεργασία, διαφορετικά μπορείτε να χρησιμοποιήσετε τη λύση pathlib.

Εν κατακλείδι

Η Python είναι εξαιρετικά εύχρηστη κατά την αλληλεπίδραση με το λειτουργικό σύστημα. Μπορείτε να αυτοματοποιήσετε τις διαδικασίες και να εξοικονομήσετε πολύ χρόνο με την Python. Οι κύριες μονάδες για αλληλεπίδραση με το λειτουργικό σύστημα είναι το os, το sys, η διαδρομή και η υποδιεργασία.

Σε αυτό το σεμινάριο μάθατε:

  • Πώς αλληλεπιδρά η Python με το λειτουργικό σύστημα
  • Η χρήση ενσωματωμένων μονάδων για την πραγματοποίηση λειτουργιών λειτουργικού συστήματος
  • Πώς να χρησιμοποιήσετε τη μονάδα εξανθρωπισμού για εκτύπωση αναγνώσιμη από τον άνθρωπο
  • Για να υπολογίσετε το μέγεθος ενός αρχείου με 3 προσεγγίσεις
  • Για να υπολογίσετε το μέγεθος ενός καταλόγου αναδρομικά ή με την εντολή du