Home » Εβδομαδιαίες Στήλες » Προγραμματισμός » Μαθήματα Προγραμματισμού Python από το PCsteps: #13

Μαθήματα Προγραμματισμού Python από το PCsteps: #13

Αυτός ο οδηγός γράφτηκε πριν από περισσότερα από 2 χρόνια. Η τεχνολογία αλλάζει και εξελίσσεται. Αν οτιδήποτε δεν σας λειτουργεί, γράψτε μας στα σχόλια και θα κοιτάξουμε να τον ανανεώσουμε.

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

Δείτε τις ενότητες του οδηγού

Προτάσεις συνεργασίας

Προωθήστε δυναμικά την επιχείρησή σας στο site του PCsteps και στο κανάλι μας στο YouTube.

Επικοινωνία

Γίνε VIP μέλος στο PCSteps

Τα μέλη υποστηρίζουν ενεργά το PCsteps για να συνεχίσει να λειτουργεί χωρίς διαφημίσεις για όλους.

Συμμετοχή

Για να δείτε όλα τα μαθήματα Python από την αρχή τους, αλλά και τα επόμενα, αρκεί να κάνετε κλικ εδώ.

Μονοπάτια αρχείων

Ένα αρχείο έχει δύο βασικές ιδιότητες: το όνομά του (filename) και ένα μονοπάτι (filepath) που καθορίζει την τοποθεσία του στον υπολογιστή. Για παράδειγμα:

C:\Users\PCsteps\Documents\pcsteps.pdf

Καθένα από τα C:\, Users, Pcsteps, και Documents είναι ένας φάκελος (folder ή directory). Το C:\, ειδικότερα, είναι ο φάκελος root (ρίζα), που περιέχει όλους τους υπόλοιπους.

Στα Windows χρησιμοποιείται για τα μονοπάτια η ανάποδη κάθετος – backslash (\), ενώ στα Linux η κανονική – slash (/). Αυτό σημαίνει ότι αν θέλουμε να δουλεύει το πρόγραμμά μας στο αντίστοιχο σύστημα, θα πρέπει να χρησιμοποιήσουμε το κατάλληλο συντακτικό για το συγκεκριμένο λειτουργικό.

Για να αποφύγουμε αυτόν τον διαχωρισμό, μπορούμε να χρησιμοποιήσουμε τη συνάρτηση os.path.join(). Περνώντας της ονόματα αρχείων και φακέλων του μονοπατιού, αυτή θα επιστρέψει ένα μονοπάτι με τα κατάλληλα διαχωριστικά σημεία στίξης.

Έτσι, το ίδιο παράδειγμα θα δώσει διαφορετικές εκτυπώσεις σε Windows…

>>> import os
>>> os.path.join('usr', 'bin', 'spam')
'usr\bin\spam'

…και Linux:

>>> import os
>>> os.path.join('usr', 'bin', 'spam')
'usr/bin/spam'

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

Η os.path.join() θα μας φανεί χρήσιμη στη δημιουργία string ως ονόματα αρχείων. Για παράδειγμα, ο ακόλουθος κώδικας συνενώνει ονόματα αρχείων, και τα τοποθετεί στο τέλος ενός μονοπατιού:

>>> myFiles = ['pcsteps.txt', 'pcsteps.pdf', 'pcsteps.docx']
>>> for filename in myFiles:
 print(os.path.join('C:\Users\PCsteps', filename))
C:\Users\PCsteps\pcsteps.txt
C:\Users\PCsteps\pcsteps.pdf
C:\Users\PCsteps\pcsteps.docx

Τρέχων φάκελος εργασίας

Κάθε πρόγραμμα που τρέχει στον υπολογιστή έχει έναν τρέχοντα φάκελο εργασίας ή cwd (Current Working Directory). Μπορούμε να λάβουμε το τρέχον directory ως string με τη συνάρτηση os.getcwd() και να το αλλάξουμε με την os.chdir().

>>> import os
>>> os.getcwd()
'C:\Python34'
>>> os.chdir('C:\Windows\System32')
>>> os.getcwd()
'C:\Windows\System32'

Αν προσπαθήσουμε να αλλάξουμε το τρέχον directory χρησιμοποιώντας λάθος όνομα (δηλαδή όνομα φακέλου που δεν υπάρχει), θα λάβουμε το αντίστοιχο error:

>>> os.chdir('C:\SapiosFakelos')
Traceback (most recent call last):
 File "<pyshell#18>", line 1, in <module>
 os.chdir('C:\SapiosFakelos')
FileNotFoundError: [WinError 2] The system cannot find the file specified:
'C:\SapiosFakelos'

Δημιουργία φακέλων

Μπορούμε να δημιουργήσουμε νέους φακέλους με το πρόγραμμά μας με τη συνάρτηση os.makedirs(). Γράφουμε πχ:

>>> import os
>>> os.makedirs('C:\PCsteps\John\pics')

Αυτό θα δημιουργήσει όχι μόνο έναν φάκελο PCsteps, εντός του C:\, αλλά και έναν φάκελο John μέσα στον PCsteps, και έναν pics μέσα στον John. Δηλαδή θα δημιουργηθούν όλοι οι απαραίτητοι ενδιάμεσοι φάκελοι, προκείμενου να διασφαλιστεί ότι το συνολικό μονοπάτι υπάρχει.

Module os.path

Το Module os.path μας προσφέρει αρκετές χρήσιμες συναρτήσεις. Πάμε να δούμε μερικές από αυτές, πέραν της os.path.join() που συναντήσαμε ήδη.

Απόλυτο και σχετικό μονοπάτι

Υπάρχουν δύο τρόποι να προσδιορίσουμε το μονοπάτι ενός αρχείου:

  • Το απόλυτο μονοπάτι, που πάντοτε ξεκινάει από τον φάκελο root.
  • Το σχετικό μονοπάτι, που εξαρτάται από τον τρέχοντα φάκελο εργασίας του προγράμματος.

Υπάρχουν επίσης και τα ειδικά ονόματα ..\ και .\ ,που σημαίνουν κάθε φορά το ίδιο πράγμα: Οι δύο τελείες συμβολίζουν τον φάκελο – γονέα του τρέχοντος φακέλου μας, και η μία τελεία τον τρέχοντα φάκελο.

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

Σημειώνεται ότι το πρόθεμα .\ στην αρχή ενός σχετικού μονοπατιού είναι προαιρετικό. Έτσι, τα .\new.txt και new.txt αναφέρονται στο ίδιο αρχείο.

Διαχείριση μονοπατιών

Για να χειριστούμε σχετικά και απόλυτα μονοπάτια, έχουμε στη διάθεσή μας αρκετές συναρτήσεις από το os.path. Ενδεικτικά:

  • Την os.path.abspath(<path>), η οποία επιστρέφει σε ένα string το απόλυτο μονοπάτι του ορίσματος <path>. Πρόκειται για έναν εύκολο τρόπο μετατροπής ενός σχετικού μονοπατιού σε απόλυτο.
  • Την os.path.isabs(<path>), η οποία επιστρέφει True αν το όρισμα είναι απόλυτο μονοπάτι και False αν είναι σχετικό.
  • Την os.path.relpath(<path>, start), που επιστρέφει σε ένα string το σχετικό μονοπάτι από το start ως το <path>.

Ας δοκιμάσουμε τις συναρτήσεις αυτές στον IDLE:

Μέγεθος αρχείου και περιεχόμενα φακέλου

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

  • Με την os.path.getsize(<path>) θα πάρουμε το μέγεθος του ορίσματος που βρίσκεται στη θέση του path.
  • Με την os.listdir(<path>) θα πάρουμε μια λίστα από string για κάθε φάκελο στο path.

Ενδεικτικά, στο σύστημά μας παίρνουμε τα παρακάτω αποτελέσματα:

Βλέπουμε, για παράδειγμα, ότι το μέγεθος της εφαρμογής για την αριθμομηχανή είναι 918.528 byte. Στον φάκελο Boot του System32 των Windows έχουμε διάφορους υποφακέλους. Αν θέλουμε να πάρουμε το συνολικό τους μέγεθος, μπορούμε να συνδυάσουμε τις δύο παραπάνω εντολές, όπως παρακάτω:

Διατρέχοντας με τον βρόχο κάθε filename του φακέλου Boot, η μεταβλητή totalSize αυξάνεται κατά το μέγεθος του εκάστοτε αρχείου. Έπειτα, σε κάθε επανάληψη, ο ακέραιος που επιστρέφει η getsize() προστίθεται στην totalSize.

Θα πρέπει, επίσης, να προσέξουμε τη χρήση της join(), για τη συνένωση του μονοπατιού του φακέλου Boot με το τρέχον filename κάθε φορά.

Ανάγνωση – εγγραφή αρχείων

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

Τέτοια αρχεία είναι για παράδειγμα τα αρχεία κειμένου με κατάληξη .txt ή τα script που γράφουμε στην Python, με κατάληξη .py.

Αντίθετα, τα έγγραφα του Word που περιέχουν επιπλέον πληροφορία, όπως γραμματοσειρά, μέγεθος, χρώμα κλπ, δεν ανήκουν σε αυτήν την κατηγορία. Τα αρχεία αυτά, όπως και τα PDF, οι εικόνες, τα .exe, και όλοι σχεδόν οι υπόλοιποι τύποι αρχείων είναι δυαδικά αρχεία (binary).

Ίσως έχουμε τυχαία διαπιστώσει τη διαφορά των απλών αρχείων κειμένου με τα δυαδικά, με έναν editor όπως το Σημειωματάριο (Notepad). Τα plaintext αρχεία ανοίγουν κανονικά με τον επεξεργαστή κειμένου, ενώ τα δυαδικά θα μας δώσουν ένα ακατανόητο συνονθύλευμα χαρακτήρων.

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

  1. Καλούμε τη συνάρτηση open() η οποία επιστρέφει ένα αντικείμενο File.
  2. Καλούμε τη μέθοδο read() ή write() πάνω στο αντικείμενο File.
  3. Κλείνουμε το αρχείο με κλήση της μεθόδου close() πάνω στο File.

Άνοιγμα αρχείου

Για να ανοίξουμε ένα αρχείο με τη συνάρτηση open(), της περνάμε σε string το μονοπάτι του αρχείου. Όπως είπαμε, η open() επιστρέφει ένα αντικείμενο File.

Ας δοκιμάσουμε το άνοιγμα δημιουργώντας ένα αρχείο hellο.txt με τον editor μας. Μπορούμε να γράψουμε ως περιεχόμενο ένα απλό “Hello world!”. Στη συνέχεια (και εφόσον δουλεύουμε σε Windows), γράφουμε στον IDLE:

>>> hello_file = open('C:\Users\PCsteps\hello.txt')

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

Προαιρετικά, μπορούμε να βάλουμε ως δεύτερο όρισμα το ‘r', που συμβολίζει την λειτουργία ανάγνωσης.

Η open() θα ανοίξει το αρχείο (από προεπιλογή ή με την χρήση του ‘r') σε λειτουργία ανάγνωσης (read mode), κάτι που σημαίνει ότι η Python μας επιτρέπει μόνο να διαβάσουμε δεδομένα από το αρχείο. Δεν μπορούμε να τροποποιήσουμε ή να προσθέσουμε δεδομένα με οποιονδήποτε τρόπο.

Το αντικείμενο File, είναι απλά άλλος ένας τύπος δεδομένων για την Python, όπως είναι και οι λίστες ή τα λεξικά. Με την παραπάνω εντολή, αποθηκεύσαμε το File που μας επέστρεψε η open() στην μεταβλητή hello_file. Τώρα, όποτε θέλουμε να ανακτήσουμε για ανάγνωση/εγγραφή το συγκεκριμένο αρχείο, αρκεί να καλέσουμε τις αντίστοιχες μεθόδους στη hello_file.

Ανάγνωση

Έχοντας ανακτήσει ένα αντικείμενο File, μπορούμε να ξεκινήσουμε να το διαβάζουμε. Αν θέλουμε να διαβάσουμε ολόκληρο το περιεχόμενο του αρχείου σαν ένα string, χρησιμοποιούμε τη μέθοδο read():

>>> hello_content = hello_file.read()
>>> hello_content
'Hello world!'

Εναλλακτικά, χρησιμοποιούμε τη μέθοδο readlines() για να λάβουμε μία λίστα με string από έναν φάκελο. Κάθε string αντιπροσωπεύει μια γραμμή κειμένου. Για παράδειγμα, δημιουργούμε ένα αρχείο ace_of_spades.txt, και γράφουμε μέσα στο αρχείο τους αντίστοιχους στίχους (προσέχοντας να τους διαχωρίζουμε με αλλαγή σειράς):

Playing for the high one, dancing with the devil,
Going with the flow, it's all a game to me,
Seven or Eleven, snake eyes watching you,
Double up or quit, double stake or split,
The Ace Of Spades

Έπειτα, στον IDLE, βλέπουμε το αποτέλεσμα της εκτύπωσης:

Εγγραφή αρχείου

Η Python μας επιτρέπει να γράψουμε στο περιεχόμενο ενός αρχείου με τρόπο παρόμοιο του τρόπου με τον οποίον εκτυπώνει η print() τα string στην οθόνη. Επειδή, όπως είδαμε, δεν μπορούμε να γράψουμε σε αρχείο που ανοίξαμε σε λειτουργία ανάγνωσης, θα πρέπει να το ανοίξουμε σε λειτουργία εγγραφής (write και append mode).

To write mode θα γράψει πάνω από το υπάρχον αρχείο, αρχίζοντας από την αρχή, όπως όταν δίνουμε καινούργια τιμή σε μια υπάρχουσα μεταβλητή. Περνώντας σαν δεύτερο όρισμα στην open() το ‘w', δίνουμε στην Python να καταλάβει ότι θέλουμε να γράψουμε στο αρχείο που ανοίγει.

Η λειτουργία append(), από την άλλη, θα γράψει στο τέλος του υπάρχοντος κειμένου του αρχείου, όπως όταν κάνουμε append σε μια λίστα. Για άνοιγμα σε append mode, περνάμε ως δεύτερο όρισμα το ‘a'.

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

Κλείσιμο αρχείου

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

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

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

Καλώντας τη write() στο ανοιχτό αρχείο, αποθηκεύουμε το string ‘Hello world!\n', προσέχοντας να προσθέσουμε και χαρακτήρα αλλαγής γραμμής στο τέλος. Έπειτα κλείνουμε τον φάκελο, για να τον ανοίξουμε ξανά αργότερα.

Επειδή θέλουμε να προσθέσουμε το string ‘Μαθήματα Python', δίχως να χάσουμε το προηγούμενο περιεχόμενο του αρχείου, ανοίγουμε  το pcsteps.txt, αυτή τη φορά σε λειτουργία append.

Αξίζει να θυμόμαστε ότι η προσθήκη χαρακτήρα newline στο τέλος του string πρέπει πάντοτε να γίνεται από εμάς, καθώς δεν την κάνει αυτόματα η Python, όπως γνωρίζουμε ότι συμβαίνει με την print().

Στο επόμενο μάθημα για τον προγραμματισμό Python

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

Σας άρεσε το σημερινό μάθημα για τον προγραμματισμό Python?

Γράψτε μας στα σχόλια για οποιαδήποτε ερωτήματα που σας γεννήθηκαν από το σημερινό μάθημα.

Για να δείτε όλα τα μαθήματα Python από την αρχή τους, αλλά και τα επόμενα, αρκεί να κάνετε κλικ εδώ.
Τα σχόλια του PCsteps έχουν μεταφερθεί στο Questions.pcsteps.gr. Αν έχετε απορίες για τη δημοσίευση ή οποιαδήποτε τεχνολογική ερώτηση, από προτάσεις αγορών μέχρι τεχνικά προβλήματα, γράψτε μας εκεί. Απαντάμε το αργότερο εντός 48 ωρών.

Οι Στήλες του PCsteps

FEATURED SALE ALERT τελικο
Οδηγοί Αγοράς
QuickSteps#324 - Προβλήματα Χάρτες Google, Η Χαμηλότερη Τιμή Παιχνιδιού Στο Steam, Dark Mode Στο Google Drive
QuickSteps
GamingSteps#20240420 - Φορητό PlayStation 1, Επιστήμονας Βρήκε Τον Καλύτερο Οδηγό Του Mario Kart 8, Cities: Skylines II
GamingSteps