7 τρόποι για να ελέγξετε εάν υπάρχει αρχείο ή φάκελος στην Python

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

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

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

Πριν ξεκινήσουμε

Πριν εκτελέσετε οποιαδήποτε εντολή παρακάτω, βεβαιωθείτε ότι έχετε εγκαταστήσει την Python 3 στο σύστημά σας. Ανοίξτε το τερματικό σας και πληκτρολογήστε την ακόλουθη εντολή:

python --version
# Python 3.9.5, my result

Εάν έχετε μια έκδοση 2.x, θα χρειαστεί να χρησιμοποιήσετε την εντολή “python3”. Ρίξτε μια ματιά στον οδηγό εγκατάστασης Python εάν δεν έχετε εγκαταστήσει την Python 3.

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

touch testfile.txt
mkdir testdirectory/ 
touch testdirectory/otherfile.txt

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

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

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

pip install ipython

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

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

Δοκιμάστε, Άνοιγμα και Εξαίρεση

Αυτή είναι η πιο απλή επιλογή. Εάν προσπαθήσετε να ανοίξετε ένα αρχείο που δεν υπάρχει, η Python θα ανεβάσει ένα FileNotFoundError.

In [1]: open('im-not-here.txt')
---------------------------------------------------------------------------
FileNotFoundError: [Errno 2] No such file or directory: 'im-not-here.txt'

Μπορούμε να εκμεταλλευτούμε αυτό και να χειριστούμε την εξαίρεση σε περίπτωση που το αρχείο που αναζητούμε δεν υπάρχει.

In [2]: try:
   ...:     file = open('im-not-here.txt')
   ...:     print(file) # File handler
   ...:     file.close()
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we're looking for doesn' exist')
   ...:     exit()
   ...: 
Sorry the file we're looking for doesn't exist

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

  Πώς να αποκτήσετε πιστοποίηση AWS Data Analytics (DAS-C01)

Σημειώστε πώς η συνάρτηση exit() θα εκτελεστεί μόνο εάν εγείρεται μια εξαίρεση. Ας δούμε τι συμβαίνει όταν το αρχείο που αναζητούμε υπάρχει στην πραγματικότητα.

In [2]: try:
   ...:     file = open('testfile.txt')
   ...:     print(file) # File handler
   ...:     file.close()
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we're looking for doesn't exist')
   ...:     exit()
   ...: 
<_io.TextIOWrapper name="testfile.txt" mode="r" encoding='UTF-8'>

Σημειώστε πώς κλείνουμε το αρχείο αμέσως αφού το ανοίξουμε. Θεωρείται καλή πρακτική σύμφωνα με το Τεκμηρίωση Python.

Κλήση file.write() χωρίς χρήση της λέξης-κλειδιού με ή κλήση του file.close() Το μπορεί να έχει ως αποτέλεσμα τα ορίσματα του file.write() να μην εγγράφονται πλήρως στο δίσκο, ακόμα κι αν το πρόγραμμα εξέλθει με επιτυχία.

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

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

In [3]: try:
   ...:     with open('testfile.txt') as file:
   ...:         print(file)
   ...:         # No need to close the file
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we're looking for doesn't exist')
   ...:     exit()
   ...: 
   ...: 
<_io.TextIOWrapper name="testfile.txt" mode="r" encoding='UTF-8'>

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

os.path.exists()

ο λειτουργική μονάδα παρέχει πολλαπλές λειτουργίες για αλληλεπίδραση με το λειτουργικό σύστημα. Για να ελέγξουμε εάν υπάρχει ένα αρχείο ή φάκελος, μπορούμε να χρησιμοποιήσουμε τη συνάρτηση path.exists() που δέχεται τη διαδρομή προς το αρχείο ή τον κατάλογο ως όρισμα. Επιστρέφει ένα boolean με βάση την ύπαρξη του μονοπατιού.

Σημείωση: Μια διαδρομή είναι η μοναδική θέση ενός αρχείου ή καταλόγου σε ένα σύστημα αρχείων

Στην Python, το os. μονοπάτι Η υπομονάδα περιέχει λειτουργίες αποκλειστικά σχεδιασμένες να λειτουργούν με διαδρομές αρχείων. Όλες αυτές οι συναρτήσεις δέχονται το όρισμα διαδρομής ως συμβολοσειρές ή byte και μπορείτε να αποφασίσετε να εργαστείτε με απόλυτες διαδρομές, για παράδειγμα:

/home/daniel/.bashrc

Ή με σχετικές διαδρομές, ανάλογα με τον κατάλογο που εκτελείτε το σενάριο:

.bashrc
# Running the script in my home folder

Ακολουθούν πολλά παραδείγματα χρησιμοποιώντας τη συνάρτηση os.path.exists(), που εκτελείται στον κατάλογο που βρίσκονται τα αρχεία δοκιμών μου:

In [1]: import os

In [2]: os.path.exists('testfile.txt')
Out[2]: True

In [3]: os.path.exists('testdirectory')
Out[3]: True

In [4]: os.path.exists('hey-i-dont-exist')
Out[4]: False

Όπως μπορείτε να δείτε, επιστρέφει True κατά τη δοκιμή με το αρχείο testfile.txt και τον φάκελο testdirectory και False όταν το αρχείο δεν υπάρχει.

  Ελέγξτε εάν χρειάζεστε γυαλιά με αυτό το διαδικτυακό διάγραμμα όρασης

os.path.isfile()

Εάν θέλατε να αποδείξετε μόνο την ύπαρξη ενός αρχείου (όχι ενός καταλόγου), θα καλούσατε τη συνάρτηση os.path.isfile().

In [1]: import os

In [2]: os.path.isfile('testfile.txt')
Out[2]: True

In [3]: os.path.isfile('testdirectory/')
Out[3]: False

In [4]: os.path.isfile('i-dont-even-exist')
Out[4]: False

In [5]: os.path.isfile('testdirectory/otherfile.txt')
Out[5]: True

Σημείωση: Στο UNIX όλοι οι κατάλογοι τελειώνουν με κάθετο προς τα εμπρός (/), ενώ στα Windows χρησιμοποιούμε ανάστροφη κάθετο ().

Στον παραπάνω κώδικα, η συνάρτηση isfile() επιστρέφει False σε δύο περιπτώσεις, ας δούμε γιατί:

  • testdirectory/ είναι ένας κατάλογος, επομένως δεν θεωρείται αρχείο. Αυτό δεν είναι απολύτως αληθές αφού στο Linux όλα είναι μια περιγραφή αρχείουαλλά η Python αντιμετωπίζει τους καταλόγους διαφορετικά για λόγους ευκολίας (Εάν προσπαθήσετε να ανοίξετε έναν κατάλογο, θα λάβετε ένα IsADirectoryError)
  • Το i-dont-even-exist δείχνει ένα αρχείο που ειρωνικά δεν υπάρχει

os.path.isdir()

Εάν θέλετε να ελέγξετε ότι ένας κατάλογος βρίσκεται στο σωστό σημείο, θα χρειαστεί να χρησιμοποιήσετε τη συνάρτηση os.path.isdir(), η οποία επιστρέφει True μόνο εάν η δεδομένη διαδρομή οδηγεί σε έναν κατάλογο.

In [1]: import os

In [2]: os.path.isdir('testfile.txt')
Out[2]: False

In [3]: os.path.isdir('testdirectory')
Out[3]: True

In [4]: os.path.isdir('anotherfile.txt')
Out[4]: False

Σημειώστε πώς τα παραπάνω παραδείγματα επιστρέφουν False ακόμα και όταν η διαδρομή δείχνει σε ένα αρχείο που υπάρχει.

Σφαίρα

ο σφαίρα Η ενότητα παρέχει λειτουργίες για εργασία Unix μοτίβα που μοιάζουν με κέλυφος (άρα δεν λειτουργεί σωστά στα Windows). Για να ελέγξετε εάν ένα αρχείο ταιριάζει με ένα μοτίβο μέσα στον τρέχοντα κατάλογο, μπορείτε να χρησιμοποιήσετε το glob.glob() λειτουργία.

In [1]: import glob

In [2]: glob.glob('testfile.txt')
Out[2]: ['testfile.txt']

In [3]: glob.glob('testdirectory')
Out[3]: ['testdirectory']

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

Σημείωση: Εάν το μοτίβο δεν ταιριάζει, θα λαμβάνετε μια κενή λίστα.

Λαμβάνοντας υπόψη ότι μπορούμε να περάσουμε μοτίβα στη συνάρτηση glob, γιατί να μην δοκιμάσουμε μερικά από τα κύρια πλεονεκτήματά της;

Ο παρακάτω κώδικας λαμβάνει όλες τις διαδρομές αρχείων με επέκταση .txt και .py αντίστοιχα:

In [4]: glob.glob('*.txt')
Out[4]: ['testfile.txt']

In [5]: glob.glob('*.py')
Out[5]: 
['pathlib-exists.py',
 'list-dir.py',
 'glob-file.py',
 'open-except.py',
 'subprocess-test.py',
 'isfile.py',
 'exists.py',
 'isdir.py']

Χρήση της τάξης διαδρομής

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

Το cherry of the cake είναι ότι οι περιπτώσεις Path έχουν όλες τις μεθόδους που χρειάζεστε για να λάβετε πληροφορίες σχετικά με μια συγκεκριμένη διαδρομή. Αυτό περιλαμβάνει παρόμοιες λειτουργίες με τις προηγούμενες επιλογές.

  Πώς να πληκτρολογείτε πιο γρήγορα email στο Gmail

Σημείωση: Θα χρειαστείτε Python 3.4 ή νεότερη έκδοση για να χρησιμοποιήσετε τη βιβλιοθήκη pathlib

Οι μέθοδοι διαδρομής που θα χρησιμοποιήσετε:

Ελέγξτε εάν υπάρχει μια διαδρομή

In [1]: from pathlib import Path

In [2]: Path('testfile.txt').exists()
Out[2]: True

In [3]: Path('im-not-here.txt').exists()
Out[3]: False

In [4]: Path('testdirectory').exists()
Out[4]: True

Λειτουργεί το ίδιο με το os.path.exists().

Ελέγξτε εάν η διαδρομή οδηγεί σε ένα αρχείο

In [5]: Path('testfile.txt').is_file()
Out[5]: True

In [6]: Path('testdirectory').is_file()
Out[6]: False

Ισοδυναμεί με το os.path.isfile().

Ελέγξτε εάν η διαδρομή οδηγεί σε έναν κατάλογο

In [7]: Path('testfile.txt').is_dir()
Out[7]: False

In [8]: Path('testdirectory').is_dir()
Out[8]: True

Αντιστοιχεί στο os.path.isdir().

υποδιεργασία

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

Σημείωση: Η εντολή δοκιμής λειτουργεί μόνο σε Unix.

Οι παρακάτω δοκιμαστικές σημαίες θα ολοκληρώσουν τη δουλειά:

  • test -e: Ελέγξτε εάν υπάρχει μια διαδρομή
  • test -f: Ελέγξτε εάν υπάρχει αρχείο
  • test-d: Ελέγξτε εάν υπάρχει φάκελος

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

man test

Έλεγχος διαδρομής με υποδιεργασία:

Ο παρακάτω κώδικας καθορίζει εάν υπάρχει μια διαδρομή συγκρίνοντας τον κωδικό επιστροφής της υποδιεργασίας με το 0.

Θυμηθείτε ότι στο Linux, εάν μια διαδικασία πήγε καλά, θα επιστρέψει μηδέν, αν δεν το έκανε, θα επιστρέψει οποιονδήποτε άλλο κωδικό.

In [1]: from subprocess import run

In [2]: run(['test', '-e', 'testfile.txt']).returncode == 0
Out[2]: True

In [3]: run(['test', '-e', 'im-not-here.txt']).returncode == 0
Out[3]: False

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

Επαλήθευση ύπαρξης αρχείου με υποδιεργασία

In [4]: run(['test', '-f', 'testfile.txt']).returncode == 0
Out[4]: True

In [5]: run(['test', '-f', 'testdirectory']).returncode == 0
Out[5]: False

Έλεγχος καταλόγου με υποδιεργασία:

In [6]: run(['test', '-d', 'testfile.txt']).returncode == 0
Out[6]: False

In [7]: run(['test', '-d', 'testdirectory']).returncode == 0
Out[7]: True

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

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

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

Το πιο απλό για να γίνει αυτό είναι:

  • Άνοιγμα και χειρισμός εξαιρέσεων αρχείων αμέσως
  • Χρησιμοποιώντας τη συνάρτηση exists() των λειτουργικών μονάδων os.path ή pathlib.

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

  • Πώς να ανοίξετε ένα αρχείο και να χειριστείτε εξαιρέσεις σε περίπτωση που δεν υπάρχει
  • Η έννοια των μονοπατιών
  • 3 διαφορετικές λειτουργίες παρέχει η υπομονάδα os.path για τον έλεγχο της ύπαρξης ενός αρχείου ή φακέλου
  • Το Unix χρησιμοποιεί κάθετες προς τα εμπρός (/), ενώ τα Windows χρησιμοποιούν κάθετες ()

Διαβάστε στη συνέχεια: Τι είναι μια υποδιεργασία στην Python; [5 Usage Examples]