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

Η εκμάθηση του τρόπου σωστής χρήσης αυτής της συνάρτησης εξοικονομεί πολύ χρόνο και αποφεύγει τα συνηθισμένα λάθη κατά την εργασία με αρχεία. Σε αυτόν τον οδηγό, θα μάθετε πώς να τη χρησιμοποιείτε. open() Για να ανοίξετε αρχεία με διαφορετικούς τρόπους και πώς να επιλέξετε την κατάλληλη λειτουργία για ανάγνωση ή γραφή, μαζί με πρακτικά παραδείγματα που θα σας βοηθήσουν να τα κατανοήσετε και να τα εφαρμόσετε εύκολα.
Η συνάρτηση open στην Python θα πρέπει να είναι η πρώτη σας επιλογή όταν διαβάζετε τα περιεχόμενα ενός αρχείου. Δώστε της ένα όνομα αρχείου και θα λάβετε ένα ευέλικτο αντικείμενο που σας επιτρέπει να διαβάζετε και να γράφετε δεδομένα, είτε σε απλό κείμενο είτε σε δυαδική μορφή.
Αυτά τα παραδείγματα καταδεικνύουν πόσο ευέλικτη είναι αυτή η λειτουργία, με υποστήριξη για διαφορετικές λειτουργίες, προσωρινή αποθήκευση, κωδικοποίηση και πολλά άλλα.
Άνοιγμα αρχείου και ανάγνωση των περιεχομένων του
Η συνάρτηση open() έχει μια μάλλον σύνθετη υπογραφή, αλλά στην απλούστερη περίπτωση, μπορείτε να τη χρησιμοποιήσετε για να ανοίξετε ένα αρχείο κειμένου όπως αυτό:
f = open(filename)
Από προεπιλογή, η Python ανοίγει αυτό το αρχείο σε λειτουργία ανάγνωσης, που σημαίνει ότι μπορείτε μόνο να διαβάσετε από αυτό. Αυτό είναι ιδανικό για αρχεία ρυθμίσεων, αρχεία στατικών δεδομένων και άλλα. Επίσης, καθιστά αυτή τη συνηθισμένη περίπτωση συνοπτική και εύκολη στην απομνημόνευση.
Η συνάρτηση open() επιστρέφει ένα αντικείμενο αρχείου που μπορείτε να χρησιμοποιήσετε για να εκτελέσετε διάφορες εργασίες, συμπεριλαμβανομένης της ανάγνωσης ολόκληρου του περιεχομένου ενός αρχείου:
f = open("/usr/share/dict/words")
text = f.read()
print(text)

Σημειώστε ότι αυτό το απλό απόσπασμα θα προκαλέσει την Python να ενεργοποιήσει μια εξαίρεση εάν το αρχείο δεν υπάρχει:
Το μόνο αρχείο που είναι εγγυημένο είναι το σενάριο που εκτελείτε, το οποίο η Python καθιστά διαθέσιμο στην ειδική μεταβλητή __file__. Αυτό διευκολύνει τη σύνταξη ενός σεναρίου που εκτυπώνει τον δικό του πηγαίο κώδικα, γνωστό και ως κυνήγι:
f = open(__file__)
text = f.read()
print(text)

Ειδοποίηση
Αν είσαι πολύ αυστηρός, δεν είναι απολύτως αλήθεια, επειδή η ανάγνωση ενός αρχείου θεωρείται απάτη.
Χρησιμοποιήστε τη λέξη-κλειδί with για να κλείσετε αυτόματα ένα αρχείο
Όταν η Python ανοίγει ένα αρχείο, κατανέμει πόρους συστήματος σε αυτό το αρχείο, τους οποίους στη συνέχεια χρησιμοποιεί για μελλοντικές λειτουργίες, όπως ανάγνωση και εγγραφή. Εάν το πρόγραμμά σας συνεχίσει να εκτελείται, η Python θα καθαρίσει αυτούς τους πόρους, καθιστώντας τους διαθέσιμους σε άλλες διεργασίες που ενδέχεται να εκτελούνται στο σύστημά σας. Ωστόσο, αυτό δεν είναι εγγυημένο, επομένως θα πρέπει πάντα να διασφαλίζετε ότι οι πόροι καθαρίζονται σωστά. Ο απλούστερος τρόπος για να το κάνετε αυτό είναι να καλέσετε ρητά τη συνάρτηση close() στο αρχείο σας όταν ολοκληρώσετε την εργασία σας σε αυτό:
f = open("/usr/share/dict/words")
text = f.read()
f.close()
Συμβουλή
Βεβαιωθείτε ότι έχετε κλείσει το αρχείο το συντομότερο δυνατό. Για παράδειγμα, εάν ανοίξετε ένα αρχείο, διαβάσετε το περιεχόμενό του και στη συνέχεια το επεξεργαστείτε, προσπαθήστε να το κλείσετε αμέσως μετά την ανάγνωσή του. Δεν χρειάζεται να διατηρείτε το αρχείο ανοιχτό κατά την επεξεργασία δεδομένων που διαβάζετε σε μια μεταβλητή.
Αλλά μπορεί να προκύψουν προβλήματα: Τι γίνεται αν η κλήση close() δεν λειτουργεί σωστά; Για να το παρακάμψετε αυτό, χρησιμοποιήστε τη λέξη-κλειδί with. Αυτό δημιουργεί έναν διαχειριστή περιβάλλοντος για το μπλοκ που ενσωματώνει, διασφαλίζοντας ότι οι πόροι του αρχείου ελευθερώνονται:
with open("/usr/share/dict/words") as f:
text = f.read()
Αντιγραφή αρχείου με ανάγνωση και γραφή
Διάφορες βιβλιοθήκες Python παρέχουν μεθόδους για την αντιγραφή ενός αρχείου, επομένως αυτό το παράδειγμα είναι καθαρά ενδεικτικό. Δείχνει τη χρήση του δεύτερου ορίσματος για το open, mode. Αυτό το όρισμα υποδεικνύει στο open πώς να χρησιμοποιήσετε το αρχείο. Μπορείτε να χρησιμοποιήσετε οποιονδήποτε έγκυρο συνδυασμό αυτών των χαρακτήρων:
| Χαρακτήρας | Νόημα |
|---|---|
| r | Διάβασε |
| w | Γράφω |
| x | Δημιουργήστε & γράψτε |
| a | Προσαρτώ |
| b | Binary |
| t | Κείμενο |
| + | Ενημέρωση |
Η προεπιλεγμένη λειτουργία είναι rt (ανάγνωση αρχείου κειμένου), επομένως το πρώτο παράδειγμα σε αυτό το άρθρο λειτούργησε όπως αναμενόταν. Για να αντιγράψετε το αρχείο από το οποίο διαβάζετε, θα χρειαστεί να ανοίξετε ένα δεύτερο αρχείο χρησιμοποιώντας τη λειτουργία w για εγγραφή. Θα χρειαστεί επίσης να χρησιμοποιήσετε τη λειτουργία b και για τις δύο, για να διασφαλίσετε ότι οι λειτουργίες ανάγνωσης και εγγραφής λαμβάνουν υπόψη τα δυαδικά δεδομένα.
source = "./image.jpg"
target = "./a-copy-of-image.jpg"
with open(source, "rb") as src, open(target, "wb") as tgt:
buffer = src.read()
tgt.write(buffer)
Το μπλοκ with λειτουργεί και στα δύο αρχεία, επομένως θα τα κλείσει αυτόματα μόλις ολοκληρωθεί.
Ειδοποίηση
Ενώ η συνάρτηση open της Python σας δίνει πρόσβαση χαμηλού επιπέδου στα περιεχόμενα ενός αρχείου, η ενότητα os παρέχει αρκετές συναρτήσεις υψηλού επιπέδου που λειτουργούν σε αρχεία και στο σύστημα αρχείων.
Δημιουργήστε ένα νέο αρχείο κειμένου
Μπορείτε επίσης να χρησιμοποιήσετε το όρισμα mode για να δημιουργήσετε ένα νέο αρχείο, αλλά να προστατεύσετε οποιοδήποτε αρχείο με το ίδιο όνομα που μπορεί να υπάρχει ήδη:
open(filename, "x")
Εάν υπάρχει ήδη ένα αρχείο με το ίδιο όνομα, αυτή η ανοιχτή κλήση θα ενεργοποιήσει μια εξαίρεση FileExistsError. Αυτή είναι μια καλή προφύλαξη που εξαλείφει την ανάγκη για ρητό έλεγχο της ύπαρξης του αρχείου:
# Warning: don't do this!
import os.path
filename = "example.txt"
if os.path.isfile(filename):
print("Sorry, file already exists")
else:
with open(filename, "w") as f:
# ...
Εκτός από τη σύνταξη λιγότερου κώδικα, υπάρχει ένας ακόμη καλύτερος λόγος για να χρησιμοποιήσετε τη λειτουργία "x": αποφεύγει μια συνθήκη κούρσας. Σκεφτείτε το παραπάνω παράδειγμα, το οποίο περιλαμβάνει μία εντολή για να ελέγξετε αν το αρχείο υπάρχει (αν os.path.isfile(όνομα αρχείου)), ακολουθούμενη από μια άλλη εντολή για να το ανοίξετε για εγγραφή (χρησιμοποιώντας open(όνομα αρχείου, "w") ως f). Εάν μια άλλη διεργασία εκτελέσει μια ενέργεια σε αυτό το αρχείο μεταξύ αυτών των δύο εντολών, μπορεί να προκληθεί καταστροφή.
Το άνοιγμα ενός αρχείου σε λειτουργία δημιουργίας μπορεί να αποτρέψει την καταστροφή, επειδή μία μόνο εντολή είναι υπεύθυνη για την επαλήθευση και το άνοιγμα του αρχείου. Είτε η λειτουργία αποτυγχάνει και το υπάρχον αρχείο προστατεύεται, είτε είναι επιτυχής και καμία άλλη διεργασία δεν μπορεί να δημιουργήσει άλλο αρχείο με το ίδιο όνομα εν τω μεταξύ.
Εγγραφή σε αρχείο καταγραφής μέσω πρόσθετου
Από προεπιλογή, ένα αρχείο που ανοίγετε σε λειτουργία εγγραφής θα περικοπεί πρώτο, επομένως τα περιεχόμενά του θα αντικατασταθούν. Για να προσθέσετε ένα αρχείο, μπορείτε να χρησιμοποιήσετε τη λειτουργία προσθήκης:
log = open("file.log", "a")
Και πάλι, η σύνδεση σε Python διευκολύνει τη χρήση της ενότητας καταγραφής, η οποία χειρίζεται πολλά από τα Μπερδεμένες λεπτομέρειες. Για παράδειγμα, μπορείτε να συνδεθείτε σε ένα αρχείο χρησιμοποιώντας έναν κώδικα παρόμοιο με τον ακόλουθο:
def startup():
print("Just a dummy")
def main():
print("Doing the main thing")
return 42
def log(msg):
logfile.write(msg + "\n")
logfile = open("file.log", "w")
log("starting startup")
startup()
log("startup finished")
log("starting main")
ret = main()
log("main finished: " + str(ret))
logfile.close()
Χρησιμοποιήστε την προσωρινή αποθήκευση για να ελέγξετε την αποθήκευση αρχείων.
Για να αποφευχθεί η συνεχής επανεκκίνηση και αποθήκευση του ίδιου αρχείου, το παράδειγμα καταγραφής χρησιμοποιεί μια καθολική μεταβλητή και ένα αναγνωριστικό αρχείου μακράς διαρκείας. Αυτό φαίνεται αποδεκτό σε ένα απλό παράδειγμα, αλλά στην πραγματικότητα, το πρόγραμμά σας μπορεί να εκτελείται επ' αόριστον και ίσως θελήσετε να ελέγξετε αυτό το αρχείο καταγραφής ανά πάσα στιγμή. Αν το κάνετε, μπορεί να εκπλαγείτε:
while True:
log(random.random())
input("Press Enter to continue")
Αυτός ο κώδικας προσομοιώνει την επαναλαμβανόμενη καταγραφή μιας διεργασίας που εκτελείται πολύ καιρό. Μπορείτε να ελέγξετε την καταγραφή πατώντας Enter όταν θέλετε να καταγράψετε μια άλλη γραμμή. Ωστόσο, όταν τον εκτελέσετε, θα παρατηρήσετε ένα σημαντικό ελάττωμα: αν πατήσετε Enter πολλές φορές και ελέγξετε το αρχείο καταγραφής, θα διαπιστώσετε ότι δεν γράφεται τίποτα σε αυτό!
Συμβουλή
Η εντολή tail—συγκεκριμένα tail -f—μπορεί να σας βοηθήσει να παρακολουθείτε αμέσως τις αλλαγές σε ένα αρχείο καταγραφής.
Αν πατήσετε Enter αρκετές φορές, θα δείτε κάποια αποτελέσματα επειδή η έξοδος θα έχει υπερβεί το προεπιλεγμένο μέγεθος buffer της Python. Στο σύστημά μου, αυτό το μέγεθος είναι 8192 byte και θα χρειαστεί πολύς χρόνος για να συσσωρευτεί.
Ευτυχώς, σε τέτοιες περιπτώσεις, υπάρχει ένα όρισμα buffering, το οποίο σας επιτρέπει να καθορίσετε μια πολιτική προσωρινής αποθήκευσης. Στην περίπτωση ενός αρχείου καταγραφής, η buffering γραμμής είναι ένας πολύ καλός τρόπος για να το κάνετε αυτό.
Δοκιμάστε να εκτελέσετε το προηγούμενο παράδειγμα με μια μικρή τροποποίηση:
logfile = open("file.log", "w", 1)
Το τρίτο όρισμα, 1, καθορίζει την προσωρινή αποθήκευση γραμμών. Όταν είναι ενεργοποιημένο, θα παρατηρήσετε ότι το αρχείο καταγραφής ενημερώνεται κάθε φορά που εκτελείτε τη συνάρτηση log(), επειδή περιλαμβάνει έναν χαρακτήρα νέας γραμμής κατά την εγγραφή στο αρχείο.
Καθορίστε μια κωδικοποίηση που να υποστηρίζει σωστά το UTF-8.
Η κωδικοποίηση χαρακτήρων είναι ένα πολύπλοκο θέμα, αλλά η ευρεία υιοθέτηση του UTF-8 σήμερα σημαίνει ότι σπάνια χρειάζεται να ανησυχείτε για αυτό. Ωστόσο, ορισμένα παλαιότερα συστήματα ενδέχεται να χρησιμοποιούν άλλες κωδικοποιήσεις και ποιος ξέρει τι μπορεί να συμβεί στο μέλλον; Τα σφάλματα κωδικοποίησης μπορούν να προκαλέσουν σημαντικά προβλήματα.
Το UTF-16 είναι μια εναλλακτική λύση στο UTF-8 και είναι πιο αποτελεσματικό για ορισμένους τύπους κειμένου. Τα περισσότερα κείμενα στην αγγλική γλώσσα είναι πιο κατάλληλα για το UTF-8, αλλά το κείμενο σε άλλες γλώσσες ή σύνολα χαρακτήρων — όπως ένα αρχείο γεμάτο με emoji — θα είναι μικρότερο εάν αποθηκευτεί σε UTF-16.
Εάν προσπαθήσετε να ανοίξετε ένα αρχείο UTF-16 χρησιμοποιώντας την τυπική μέθοδο ανοίγματος, θα δείτε το ακόλουθο σφάλμα:
Η συνάρτηση open αναμένει κωδικοποίηση UTF-8 από προεπιλογή, με ορισμένες προειδοποιήσεις, επομένως θα πρέπει να καθορίσετε την κωδικοποίηση για να ανοίξετε ένα αρχείο UTF-16:
f = open("../utf16-file.txt", encoding="utf-16")
Χρησιμοποιώντας ένα ονομασμένο όρισμα, μπορείτε να αφήσετε τα ορίσματα λειτουργίας και προσωρινής μνήμης ως προεπιλογή. Ή μπορείτε να καθορίσετε προεπιλεγμένες (ή προσαρμοσμένες) τιμές για αυτά:
f = open("../utf16-file.txt", "r", -1, "utf-16")
Ακόμα κι αν ανοίγετε ένα αρχείο με κωδικοποίηση UTF-8, συνιστάται να δηλώσετε ρητά την κωδικοποίηση χρησιμοποιώντας αυτό το όρισμα. Ορισμένα λειτουργικά συστήματα (όπως τα Windows) ενδέχεται να χρησιμοποιούν κωδικοποιήσεις διαφορετικές από την UTF-8, επομένως συνιστάται να μην βασίζεστε στην προεπιλογή.

Χειρισμός αρχείων με λανθασμένη μορφοποίηση χρησιμοποιώντας τον τελεστή σφάλματος
Παρόλο που πρέπει να είστε προσεκτικοί ώστε να καθορίσετε μια συγκεκριμένη κωδικοποίηση, αυτό μπορεί να μην είναι πάντα εφικτό. Ωστόσο, η συνάρτηση open δεν αποτυγχάνει απαραίτητα εάν υπάρχουν σφάλματα κωδικοποίησης. Μπορείτε να χρησιμοποιήσετε την παράμετρο σφάλματος για να επιλέξετε τη συμπεριφορά της από διάφορες επιλογές.
Η προεπιλεγμένη τιμή είναι "strict", η οποία δημιουργεί μια εξαίρεση, αλλά μπορείτε να αγνοήσετε εντελώς αυτά τα σφάλματα χρησιμοποιώντας την εντολή "ignore":
f = open("../utf16-file.txt", errors='ignore')
Το μειονέκτημα είναι ότι ενδέχεται πλέον να έχετε να κάνετε με κατεστραμμένα δεδομένα χωρίς να το γνωρίζετε. Το πόσο καλά μπορείτε να το χειριστείτε αυτό εξαρτάται από τη φύση των δεδομένων σας.
Μια συνηθισμένη εναλλακτική λύση είναι η αντικατάσταση των χαρακτήρων που λείπουν με έναν χαρακτήρα που υποδεικνύει ότι λείπουν, συνήθως ένα ερωτηματικό. Μπορεί να έχετε παρατηρήσει περιστασιακά αυτή τη συμπεριφορά σε ιστοσελίδες που δεν είχαν κωδικοποιηθεί σωστά. Μια τιμή "αντικατάστασης" για την παράμετρο σφάλματος θα κάνει ακριβώς αυτό.
Τέλος, η τιμή "ανάστροφη κάθετος" θα αντικαταστήσει κάθε λανθασμένο χαρακτήρα με το αντίστοιχο ως ακολουθία διαφυγής ανάστροφης κάθετου Python. Αυτό μπορεί να σας βοηθήσει να διορθώσετε την αιτία του προβλήματος, επομένως μπορεί να είναι χρήσιμο για δοκιμές ή ως μέρος ενός κιτ εργαλείων ανάπτυξης.
Κυριαρχία συνάρτησης open() Είναι ένα απαραίτητο βήμα για κάθε προγραμματιστή Python που εργάζεται με δεδομένα που είναι αποθηκευμένα σε αρχεία. Είτε θέλετε να διαβάσετε ρυθμίσεις από ένα αρχείο κειμένου είτε να δημιουργήσετε ένα νέο αρχείο για να αποθηκεύσετε τα αποτελέσματα του προγράμματός σας, η κατανόηση των διαφόρων επιλογών ανοίγματος, κλεισίματος και λειτουργίας κάνει την εργασία σας πιο επαγγελματική. Δοκιμάστε τα παραδείγματα μόνοι σας για να δείτε πώς αυτή η συνάρτηση κάνει τον καθημερινό σας προγραμματισμό ευκολότερο.



