PageSourceSearch

https://devappslearn.com/_next/static/chunks/3833.809bc46a5f7d104c.js

js devappslearn.com collected 2026-10-09 22:57:23 UTC 47,223 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3833],{63833:t=>{t.exports=JSON.parse('{"title":"File Handling","translatedTitle":"Χειρισμός Αρχείων","lessons":[{"slug":"opening-and-closing-files","title":"6.1 Άνοιγμα και Κλείσιμο Αρχείων: Ο Κύκλος Ζωής ενός Πόρου","description":"Ο χειρισμός αρχείων είναι η γέφυρα προς τη μόνιμη αποθήκευση, επιτρέποντας στα προγράμματα να επιβιώνουν μετά την εκτέλεση.","course":"python","content":[{"type":"p","text":"Ένα πρόγραμμα, κατά την εκτέλεσή του, ζει εξ ολοκλήρου στην πτητική μνήμη (RAM) του υπολογιστή. Όλα τα αντικείμενα, οι μεταβλητές και οι δομές δεδομένων που δημιουργούμε παύουν να υπάρχουν μόλις το πρόγραμμα τερματιστεί. Ο <strong>Χειρισμός Αρχείων (File I/O - Input/Output)</strong> είναι ο θεμελιώδης μηχανισμός που επιτρέπει στα προγράμματά μας να επικοινωνούν με το σύστημα αρχείων του λειτουργικού συστήματος, παρέχοντας <strong>μονιμότητα (persistence)</strong>. Είναι η γέφυρα που επιτρέπει στα δεδομένα να επιβιώνουν μετά την εκτέλεση, να διαβάζονται από άλλες εφαρμογές και να αποθηκεύονται για μελλοντική χρήση. Αυτή η διαδικασία είναι, στην ουσία, μια διαχειριζόμενη \\\\\\"συνομιλία\\\\\\" με το λειτουργικό σύστημα, όπου το πρόγραμμά μας ζητά πρόσβαση σε έναν εξωτερικό πόρο (ένα αρχείο), εκτελεί λειτουργίες ανάγνωσης ή εγγραφής, και τέλος, απελευθερώνει αυτόν τον πόρο."},{"type":"h3","text":"6.1.1 Θεωρία"},{"type":"p","text":"<strong>E/S Αρχείων: Η Πύλη προς τα Μόνιμα Δεδομένα</strong>"},{"type":"p","text":"Στον κόσμο του προγραμματισμού, τα δεδομένα που χειριζόμαστε συχνά πρέπει να επιβιώνουν πέραν της εκτέλεσης του προγράμματος. Φανταστείτε έναν επεξεργαστή κειμένου. Αν το έγγραφό σας εξαφανιζόταν κάθε φορά που κλείνατε την εφαρμογή, θα ήταν άχρηστο. Εδώ ακριβώς ο <strong>Χειρισμός Αρχείων (E/S - Είσοδος/Έξοδος)</strong> καθίσταται απαραίτητος. Τα προγράμματά μας λειτουργούν μέσα στην <strong>πτητική μνήμη (RAM)</strong> του υπολογιστή, έναν προσωρινό χώρο εργασίας όπου τα δεδομένα αποθηκεύονται μόνο για όσο διάστημα παρέχεται ρεύμα ή εκτελείται το πρόγραμμα. Μόλις το πρόγραμμα τερματιστεί, όλες οι μεταβλητές, τα αντικείμενα και οι δομές δεδομένων του διαγράφονται από τη RAM."},{"type":"p","text":"Η <strong>Μονιμότητα (Persistence)</strong> είναι η ικανότητα των δεδομένων να επιβιώνουν πέραν της εκτέλεσης του προγράμματος που τα δημιούργησε. Ο χειρισμός αρχείων E/S είναι ο πρωταρχικός μηχανισμός που προσφέρει η Python για την επίτευξη αυτής της μονιμότητας. Επιτρέπει στα προγράμματά μας να αλληλεπιδρούν με το <strong>σύστημα αρχείων</strong> του υπολογιστή, επιτρέποντας την αποθήκευση και ανάκτηση δεδομέÎ
1½Ï‰Î½ σε μη πτητικές συσκευές αποθήκευσης όπως σκληροί δίσκοι, SSD ή USB sticks. Αυτή η αλληλεπίδραση δεν είναι μια άμεση χειραγώγηση του υλικού αποθήκευσης, αλλά μάλλον μια \xabσυνομιλία\xbb που διαχειρίζεται το λειτουργικό σύστημα, το οποίο παρέχει έναν ασφαλή και δομημένο τρόπο για τις εφαρμογές να έχουν πρόσβαση στα αρχεία."},{"type":"p","text":"<strong>Η Συνάρτηση `open()` και το Αντικείμενο Χειρισμού Αρχείου</strong>"},{"type":"p","text":"Το ταξίδι της αλληλεπίδρασης με ένα αρχείο στην Python ξεκινά με την ενσωματωμένη συνάρτηση <code>open()</code>. Ο θεμελιώδης σκοπός της είναι να δημιουργήσει μια σύνδεση μεταξύ του προγράμματός σας Python και ενός αρχείου στο σύστημα αρχείων. Η σύνταξη είναι συνήθως <code>open(file, mode=\'r\', encoding=None)</code>, όπου:<ul><li><code>file</code> είναι μια συμβολοσειρά που αντιπροσωπεύει τη διαδρομή προς το αρχείο.</li><li><code>mode</code> καθορίζει πώς σκοπεύετε να αλληλεπιδράσετε με το αρχείο (π.χ., ανάγνωση, εγγραφή, προσάρτηση).</li><li><code>encoding</code> (ειδικά σε λειτουργία κειμένου) ορίζει πώς οι χαρακτήρες μεταφράζονται σε bytes και αντίστροφα.</li></ul>"},{"type":"p","text":"Είναι κρίσιμο να κατανοήσουμε ότι η <code>open()</code> δεν επιστρέφει το πραγματικό περιεχόμενο του αρχείου. Αντ\' αυτού, επιστρέφει ένα <strong>αντικείμενο χειρισμού αρχείου</strong> (συχνά αναφέρεται ως αντικείμενο αρχείου ή ροή αρχείου). Αυτό το αντικείμενο είναι έÎ
1½Î±Ï‚ <strong>αντιπρόσωπος (proxy)</strong> ή ένας <strong>αγωγός</strong>, που αντιπροσωπεύει την ανοιχτή σύνδεση με το αρχείο. Είναι μια αφαίρεση που παρέχεται από το λειτουργικό σύστημα και επιτρέπει στο πρόγραμμά σας να εκτελεί λειτουργίες όπως ανάγνωση ή εγγραφή χωρίς να χρειάζεται να κατανοεί τις λεπτομέρειες χαμηλού επιπέδου για το πώς αποθηκεύεται φυσικά το αρχείο. Το αντικείμενο χειρισμού αρχείου διατηρεί κρίσιμες <strong>πληροφορίες κατάστασης</strong>, όπως την τρέχουσα <strong>θέση του δρομέα</strong> (όπου θα πραγματοποιηθεί η επόμενη λειτουργία ανάγνωσης ή εγγραφής) και τον <strong>τρόπο λειτουργίας</strong> με τον οποίο ανοίχτηκε το αρχείο."},{"type":"p","text":"<strong>Λειτουργίες Αρχείου: Δηλώνοντας την Πρόθεσή σας</strong>"},{"type":"p","text":"Η παράμετρος `mode` στη συνάρτηση `open()` είναι μια ισχυρή δηλωτική δήλωση. Λέει στο λειτουργικό σύστημα τις προθέσεις σας για την πρόσβαση στο αρχείο, γεγονός που επηρεάζει τον τρόπο με τον οποίο το αρχείο αντιμετωπίζεται και ποιες λειτουργίες επιτρέπονται. Η κατανόηση αυτών των λειτουργιών είναι απαραίτητη για την αποφυγή ακούσιας απώλειας δεδομένων και τη διασφάλιση της σωστής διαχείρισης των αρχείων."},{"type":"p","text":"<ul><li><strong>`\'r\'` (Λειτουργία Ανάγνωσης):</strong> Αυτή είναι η <strong>προεπιλεγμένη λειτουργία</strong>. Ανοίγει το αρχείο μόνο για ανάγνωση, πράγμα που σημαίνει ότι μπορείτε να ανακτήσετε δεδομένα από το αρχείο αλλά όχι να το τροποποιήσετε. Ο δρομέας του αρχείου τοποθετείται στην αρχή του αρχείου. Εάν το καθορισμένο αρχείο δεν υπάρχει, η Python θα προκαλέσει ένα `FileNotFoundError`.</li><li><strong>`\'w\'` (Λειτουργία Εγγραφής):</strong> Αυτή η λειτουργία ανοίγει το αρχείο μόνο για εγγραφή. Εάν το αρχείο υπάρχει ήδη, το περιεχόμενό του <strong>αμετάκλητα περικόπτεται (διαγράφεται)</strong>, ξεκινώντας ουσιαστικά με ένα κενό αρχείο. Εάν το αρχείο δεν υπάρχει, δημιουργείται ένα νέο. Ο δρομέας τοποθετείται στην αρχή. <strong>Χρησιμοποιήστε το με μεγάλη προσοχή!</strong></li><li><strong>`\'a\'` (Λειτουργία Προσάρτησης):</strong> Αυτή η λειτουργία ανοίγει το αρχείο για εγγραφή, αλλά με μια κρίσιμη διαφορά: οποιαδήποτε νέα δεδομένα γράφονται θα προστεθούν στο <strong>τέλος του αρχείου</strong>, διατηρώντας το υπάρχον περιεχόμενο. Εάν το αρχείο δεν υπάρχει, θα δημιουργηθεί. Ο δρομέας τοποθετείται αυτόματα στο τέλος του αρχείου κατά το άνοιγμα.</li></ul>"},{"type":"p","text":"<strong>Τροποποιητής `\'+\'` (Ανάγνωση και Εγγραφή):</strong> Προσθέτοντας `\'+\'` σε οποιαδήποτε από τις κύριες λειτουργίες (π.χ., `\'r+\'`, `\'w+\'`, `\'a+\'`), υποδεικνύετε ότι το αρχείο πρέπει να ανοίξει για <strong>ανάγνωση και εγγραφή</strong>.<ul><li>`\'r+\'`: Ανοίγει ένα υπάρχον αρχείο τόσο για ανάγνωση όσο και για εγγραφή. Ο δρομέας ξεκινά από την αρχή. Θα προκαλέσει έÎ
1½Î± `FileNotFoundError` εάν το αρχείο δεν υπάρχει.</li><li>`\'w+\'`: Δημιουργεί ένα κενό αρχείο τόσο για ανάγνωση όσο και για εγγραφή. Εάν το αρχείο υπάρχει, περικόπτεται πρώτα.</li><li>`\'a+\'`: Ανοίγει το αρχείο τόσο για ανάγνωση όσο και για προσάρτηση. Ο δρομέας ξεκινά από την αρχή για ανάγνωση, αλλά όλες οι εγγραφές πραγματοποιούνται στο τέλος του αρχείου.</li></ul>"},{"type":"p","text":"<strong>Λειτουργίες `\'b\'` (Δυαδική) vs. `\'t\'` (Κειμένου):</strong> Αυτή η διάκριση καθορίζει τον τρόπο χειρισμού των δεδομένων.<ul><li><strong>Λειτουργία Κειμένου (προεπιλογή, υπονοείται από τα \'r\', \'w\', \'a\'):</strong> Σε αυτή τη λειτουργία, η Python αναμένει να λειτουργεί με <strong>συμβολοσειρές</strong> (ακολουθίες χαρακτήρων Unicode). Κατά την εγγραφή, αυτές οι συμβολοσειρές <strong>κωδικοποιούνται</strong> σε ακατέργαστα bytes χρησιμοποιώντας μια καθορισμένη κωδικοποίηση χαρακτήρων (π.χ., UTF-8, ASCII). Κατά την ανάγνωση, τα bytes <strong>αποκωδικοποιούνται</strong> ξανά σε συμβολοσειρές. Αυτή η αυτόματη κωδικοποίηση/αποκωδικοποίηση είναι βολική για αρχεία που είναι αναγνώσιμα από τον άνθρωπο. Η παράμετρος `encoding` είναι κρίσιμη εδώ.</li><li><strong>Δυαδική Λειτουργία (π.χ., `\'rb\'`, `\'wb\'`, `\'ab\'`):</strong> Προσθέτοντας `\'b\'` στη λειτουργία, λέτε στην Python να αντιμετωπίζει το αρχείο ως μια ροή <strong>ακατέργαστων bytes</strong>. Δεν πραγματοποιείται καμία κωδικοποίηση ή αποκωδικοποίηση. Αυτή η λειτουργία είναι <strong>απολύτως απαραίτητη</strong> για τον χειρισμό αρχείων που δεν είναι κείμενο, όπως εικόνες (JPEG, PNG), ήχος (MP3), βίντεο (MP4), εκτελέσιμα αρχεία, ή οποιαδήποτε δεδομένα που δεν αντιπροσωπεύονται φυσικά ως κείμενο αναγνώσιμο από τον άνθρωπο. Όταν διαβάζετε σε δυαδική λειτουργία, λαμβάνετε αντικείμενα `bytes`, και όταν γράφετε, πρέπει να παρέχετε αντικείμενα `bytes`.</li></ul>"},{"type":"p","text":"<strong>Η Κρισιμότητα της `close()`</strong>"},{"type":"p","text":"Αφού ολοκληρώσετε την αλληλεπίδραση με ένα αρχείο, είναι <strong>υποχρεωτικό</strong> να το κλείσετε ρητά χρησιμοποιώντας τη μέθοδο `.close()` στο αντικείμενο χειρισμού αρχείου. Η παράλειψη κλεισίματος αρχείων μπορεί να οδηγήσει σε σοβαρά προβλήματα:"},{"type":"p","text":"<ul><li><strong>Διαρροές Πόρων:</strong> Όταν ανοίγεται ένα αρχείο, το λειτουργικό σύστημα εκχωρεί μια ειδική εσωτερική δομή δεδομένων που ονομάζεται <strong>περιγραφέας αρχείου</strong> (ή file handle στα Windows) για τη διαχείριση της σύνδεσης. Τα λειτουργικά συστήματα έχουν ένα πεπερασμένο όριο στον αριθμό των περιγραφέων αρχείων που μπορεί να κρατήσει ανοιχτά μια μεμονωμένη διαδικασία ταυτόχρονα. Εάν το πρόγραμμά σας ανοίγει συνεχώς αρχεία χωρίς να τα κλείνει, μπορεί γρήγορα να εξαντλήσει αυτούς τους πόρους. Αυτό μπορεί να οδηγήσει στο να μην μπορεί το πρόγραμμά σας να ανοίξει νέα αρχεία, ή χειρότερα, να εμποδίσει άÎ
1»Î»ÎµÏ‚ εφαρμογές ή ακόμα και το ίδιο το λειτουργικό σύστημα από το να λειτουργήσουν σωστά.</li><li><strong>Απώλεια Δεδομένων λόγω Buffering:</strong> Για βελτιστοποίηση της απόδοσης, οι λειτουργίες εγγραφής σε σύγχρονα λειτουργικά συστήματα και γλώσσες προγραμματισμού (συμπεριλαμβανομένης της Python) συχνά <strong>αποθηκεύονται προσωρινά (buffered)</strong>. Αυτό σημαίνει ότι όταν καλείτε μια μέθοδο `.write()`, τα δεδομένα δεν γράφονται αμέσως byte-προς-byte στη φυσική συσκευή αποθήκευσης. Αντ\' αυτού, συλλέγονται πρώτα σε έναν προσωρινό χώρο στη μνήμη (buffer). Η μέθοδος `.close()` εκτελεί μια κρίσιμη λειτουργία που ονομάζεται <strong>\xabέκπλυση του buffer\xbb (flushing the buffer)</strong>, η οποία εξαναγκάζει όλα τα υπόλοιπα δεδομένα του buffer να γραφτούν από τη μνήμη στο πραγματικό αρχείο στο δίσκο. Εάν ένα αρχείο δεν κλείσει, οποιαδήποτε δεδομένα εξακολουθούν να βρίσκονται στο buffer ενδέχεται να μην φτάσουν ποτέ στο αρχείο, οδηγώντας σε <strong>ατελή ή κατεστραμμένα αρχεία</strong>. Ενώ ο συλλέκτης απορριμμάτων της Python μπορεί τελικά να κλείσει τα αρχεία χωρίς αναφορά, η εξάρτηση από αυτό είναι κακή πρακτική και δεν προσφέρει καμία εγγύηση για το πότε θα εκπλυθούν οι buffers ή θα απελευθερωθούν οι πόροι.</li></ul>"},{"type":"h3","text":"6.1.2 Παράδειγμα"},{"type":"code","code":"# Η μη ασφαλής, κλασική προσέγγιση\\nfile_handle = open(\'my_first_file.txt\', \'w\', encoding=\'utf-8\') # \'utf-8\' είναι καλή πρακτική\\nfile_handle.write(\\"Αυτή είναι η πρώτη γραмμή.\\\\n\\")\\nfile_handle.close() # Απαραίτητο κλείσιμο\\n\\n# Ανάγνωση του αρχείου\\nfile_handle = open(\'my_first_file.txt\', \'r\', encoding=\'utf-8\')\\ncontent = file_handle.read()\\nfile_handle.close()\\nprint(f\\"Περιεχόμενο του αρχείου: {content}\\")"}]},{"slug":"with-open-statement","title":"6.2 Η Εντολή \'with open()\'","description":"Η εντολή `with` είναι η σύγχρονη, ασφαλής και \'Pythonic\' λύση για την αυτοματοποιημένη διαχείριση πόρων.","course":"python","content":[{"type":"p","text":"Η χειροκίνητη διαχείριση του open() και close() είναι επιрρεпής σε σφάλματα, ειδικά αν προκύψουν εξαιρέσεις (exceptions) μεταξύ των δύο κλήσεων. Η εντολή with είναι η σύγχρονη, ασφαλής και \\\\\\"Pythonic\\\\\\" λύση."},{"type":"h3","text":"6.2.1 Θεωρία"},{"type":"p","text":"<strong>Το Πρωτόκολλο Διαχείρισης Πλαισίου (Context Management Protocol):</strong><br>Η εντολή `with` δεν είναι απλώς συντακτική ευκολία\xb7 είναι η υλοποίηση ενός ισχυρού πρωτοκόλλου. Οποιοδήποτε αντικείμενο στην Python υλοποιεί δύο ειδικές μεθόδους, `__enter__()` και `__exit__()`, μπορεί να χρησιμοποιηθεί σε μια δήλωση `with`. Ένα τέτοιο αντικείμενο ονομάζεται διαχειριστής πλαισίου (context manager).<br><br><strong>Η Ροή Εκτέλεσης:</strong><br>Όταν ο διερμηнέας συναντά τη γραμμή `with expression as variable:`, εκτελεί τα εξής βήματα:<br>1. Καλεί τη μέθοδο `__enter__()` του αντικειμένου που προκύπτει από την `expression` (στην περίπτωσή μας, το αντικείμενο χειρισμού αρχείου που επιστρέφει η `open()`).<br>2. Η τιμή που επιστρέφεται από την `__enter__()` ανατίθεται στη `variable` (στην περίπτωσή μας, το ίδιο το file handle).<br>3. Εκτελείται το μπλοκ κώδικα που βρίσκεται μέσα στη δήλωση `with`.<br>4. <strong>Εγγυημένη Εκτέλεση:</strong> Μόλις η εκτέλεση εξέλθει από το μπλοκ `with`, για οποιονδήποτε λόγο (είτε επειδή ολοκληρώθηκε φυσιολογικά είτε επειδή προέκυψε ένα σφάλμα/εξαίρεση), η Python εγγυάται ότι θα καλέσει τη μέθοδο `__exit__()` του αντικειμένου. Για τα αντικείμενα αρχείου, η μέθοδος `__exit__()` είÎ
1½Î±Î¹ αυτή που περιέχει τη λογική για το κλείσιμο του αρχείου (`file.close()`).<br><br><strong>Σύνδεση με το Παράδειγμα RAII:</strong><br>Αυτό το μοτίβο είναι εννοιολογικά ταυτόσημο με την τεχνική RAII (Resource Acquisition Is Initialization) που είναι δημοφιλής σε γλώσσες όπως η C++. Η ιδέα είναι ότι η απόκτηση ενός πόρου (άνοιγμα αρχείου) συνδέεται με την αρχικοποίηση ενός αντικειμένου, και η απελευθέρωση του πόρου (κλείσιμο αρχείου) συνδέεται με την καταστροφή του αντικειμένου (έξοδος από το scope). Αυτό καθιστά τη διαχείριση πόρων αυτόματη, ασφαλή και λιγότερο επιрρεπή σε ανθρώπινο λάθος."},{"type":"h3","text":"6.2.2 Παράδειγμα"},{"type":"code","code":"# Η σύγχρονη, ασφαλής και προτεινόμενη προσέγγιση.\\n# Το αρχείο κλείνει αυτόματα, ακόμη και αν προκύψει σφάλμα.\\ntry:\\n    with open(\'my_data.txt\', \'w\', encoding=\'utf-8\') as f:\\n        f.write(\\"Πρώτη γραмμή δεδομένων.\\\\n\\")\\n        f.write(\\"Δεύτερη γραμμή δεδομένων.\\\\n\\")\\n        # Εδώ θα μπορούσε να συμβεί ένα σφάλμα, π.χ., 1 / 0\\n    print(\\"Η εγγραφή στο \'my_data.txt\' ολοκληρώθηκε με επιτυχία.\\")\\n\\n    with open(\'my_data.txt\', \'r\', encoding=\'utf-8\') as f:\\n        print(\\"\\\\nΑνάγνωση περιεχομένου:\\")\\n        for line in f:\\n            print(line.strip()) # .strip() για αφαίρεση του χαρακτήρα νέας γραμμής\\n\\nexcept Exception as e:\\n    print(f\\"Προέκυψε ένα σφάλμα: {e}\\")\\n    # Ακόμα και σε αυτή την περίπτωση, το \'with\' έχει ήδη φροντίσει να κλείσει το αρχείο."}]},{"slug":"reading-methods","title":"6.3 Μέθοδοι Ανάγνωσης Αρχείων","description":"Εξετάζουμε τις διάφορες μεθόδους για την εξαγωγή περιεχομένου από ένα αρχείο, δίνοντας έμφαση στην αποδοτικότητα της μνήμης.","course":"python","content":[{"type":"p","text":"Αφού ένα αρχείο ανοιχτεί σε λειτουργία ανάγνωσης, έχουμε διάφορες μεθόδους για να εξάγουμε το περιεχόμενό του."},{"type":"h3","text":"6.3.1 Θεωρία"},{"type":"p","text":"<strong>Κατανόηση των Μεθόδων Ανάγνωσης Αρχείων της Python: Μια Βαθιά Βουτιά</strong>"},{"type":"p","text":"Η εργασία με αρχεία είναι μια θεμελιώδης πτυχή του προγραμματισμού, επιτρέποντας στις εφαρμογές να διατηρούν δεδομένα και να αλληλεπιδρούν με το εξωτερικό περιβάλλον. Στην Python, μόλις ένα αρχείο ανοιχτεί με επιτυχία σε λειτουργία ανάγνωσης (\'r\'), το επόμενο βήμα είναι η εξαγωγή του περιεχομένου του. Η Python προσφέρει διάφορες μεθόδους για αυτόν τον σκοπό, καθεμία με τα δικά της χαρακτηριστικά όσον αφορά την αποδοτικότητα της μνήμης, τον έλεγχο και τις τυπικές περιπτώσεις χρήσης. Η κατανόηση αυτών των αποχρώσεων είναι κρίσιμη για τη συγγραφή ανθεκτικού και αποδοτικού κώδικα χειρισμού αρχείων."},{"type":"p","text":"<strong>Ο Δρομέας Ανάγνωσης: Η Θέση σας στο Αρχείο</strong>"},{"type":"p","text":"Μια κεντρική έννοια στην ανάγνωση αρχείων είναι ο <strong>δρομέας ανάγνωσης</strong> (συχνά απλώς ονομάζεται <strong>δρομέας αρχείου</strong> ή <strong>δείκτης αρχείου</strong>). Όταν ανοίγετε ένα αρχείο, το σχετικό <strong>αντικείμενο χειρισμού αρχείου</strong> διατηρεί έναν εσωτερικό δρομέα που δείχνει την τρέχουσα θέση μέσα στο αρχείο. Σκεφτείτε το σαν τον αναβοσβήνοντα δρομέα σε έναν επεξεργαστή κειμένου: υποδεικνύει πού θα πραγματοποιηθεί η επόμενη ενέργεια."},{"type":"p","text":"<ul><li>Αρχικά, όταν ένα αρχείο ανοίγεται για ανάγνωση, ο δρομέας τοποθετείται συνήθως στην <strong>αρχή του αρχείου</strong> (θέση 0).</li><li>Κάθε λειτουργία ανάγνωσης, ανεξάρτητα από τη μέθοδο που χρησιμοποιείται, ξεκινά από την τρέχουσα θέση του δρομέα.</li><li>
1Αφού διαβαστούν τα δεδομένα, ο δρομέας προχωρά αυτόματα στη θέση αμέσως μετά τα δεδομένα που μόλις καταναλώθηκαν. Αυτή η διαδοχική κίνηση διασφαλίζει ότι οι επόμενες λειτουργίες ανάγνωσης συνεχίζουν από εκεί που σταμάτησε η προηγούμενη, εκτός εάν επανατοποθετηθεί ρητά (π.χ., με τη χρήση του `.seek()`).</li></ul>"},{"type":"p","text":"Αυτή η διαχείριση του δρομέα είναι ζωτικής σημασίας επειδή υπαγορεύει ποιο περιεχόμενο θα διαβαστεί στη συνέχεια και αποτρέπει την περιττή ανάγνωση από την αρχή του αρχείου, εκτός εάν αυτό είναι επιθυμητό."},{"type":"p","text":"<strong>Λεπτομερείς Μέθοδοι Ανάγνωσης Αρχείων και Διαχείριση Μνήμης</strong>"},{"type":"p","text":"Η επιλογή της μεθόδου ανάγνωσης αρχείων επηρεάζει σημαντικά τη χρήση της μνήμης, ειδικά όταν πρόκειται για μεγάλα αρχεία. Ας εξερευνήσουμε τις κοινές μεθόδους λεπτομερώς:"},{"type":"p","text":"<strong>Η Μέθοδος `.read(size=-1)`</strong>"},{"type":"p","text":"Η μέθοδος `.read()` είναι σχεδιασμένη για να εξάγει περιεχόμενο από ένα αρχείο και να το επιστρέφει ως μία ενιαία συμβολοσειρά. Η συμπεριφορά της εξαρτάται κρίσιμα από το προαιρετικό όρισμα `size`:<ul><li>Εάν το `size` παραλειφθεί ή καθοριστεί ως `-1` (η προεπιλεγμένη του τιμή), η μέθοδος προσπαθεί να διαβάσει το <strong>ολόκληρο το υπόλοιπο περιεχόμενο</strong> του αρχείου από την τρέχουσα θέση του δρομέα μέχρι το τέλος. Το αποτέλεσμα επιστρέφεται ως μία ενιαία συμβολοσειρά.</li><li>Εάν το `size` παρέχεται ως θετικός ακέραιος, το `.read()` θα διαβάσει μέχρι και τόσους χαρακτήρες (για λειτουργία κειμένου) ή bytes (για δυαδική λειτουργία). Ο δρομέας προχωρά κατά τον αριθμό των χαρακτήρων/bytes που διαβάστηκαν.</li></ul>"},{"type":"p","text":"<strong>Κρίσιμη Προειδοποίηση για τη Μνήμη:</strong> Η χρήση του `.read()` χωρίς όρισμα σε ένα πολύ μεγάλο αρχείο είναι εξαιρετικά επικίνδυνη. Η Python θα προσπαθήσει να φορτώσει ολόκληρο το περιεχόμενο του αρχείου στη <strong>Μνήμη Τυχαίας Πρόσβασης (RAM)</strong> του υπολογιστή σας. Εάν το αρχείο είναι μεγαλύτερο από τη διαθέσιμη RAM, αυτό μπορεί να οδηγήσει σε `OutOfMemoryError`, προκαλώντας τη συντριβή του προγράμματός σας, το πάγωμα του συστήματός σας ή τη σημαντική υποβάθμιση της απόδοσης. Αυτή η μέθοδος είναι καταλληλότερη για σενάρια όπου είστε απολύτως βέβαιοι ότι το αρχείο είναι μικρό και το περιεχόμενό του μπορεί να κρατηθεί με ασφάλεια στη μνήμη, όπως αρχεία ρυθμίσεων ή μικρά scripts."},{"type":"p","text":"<strong>Η Μέθοδος `.readline()`</strong>"},{"type":"p","text":"Η μέθοδος `.readline()` προσφέρει μια πιο λεπτομερή προσέγγιση στην ανάγνωση αρχείων. Διαβάζει μία μόνο γραμμή από το αρχείο, ξεκινώντας από την τρέχουσα θέση του δρομέα, μέχρι και τον επόμενο <strong>χαρακτήρα νέας γραμμής (\\\\\\\\n)</strong>. Εάν το τέλος του αρχείου επιτευχθεί πριν από έναν χαρακτήра νέας γραμμής, διαβάζει το υπόλοιπο περιεÏ
1‡ÏŒÎ¼ÎµÎ½Î¿. Εάν ο δρομέας βρίσκεται ήδη στο τέλος του αρχείου, επιστρέφει μια κενή συμβολοσειρά (<code>\'\'</code>)."},{"type":"p","text":"Αυτή η μέθοδος είναι ιδιαίτερα χρήσιμη όταν χρειάζεται να επεξεργαστείτε ένα αρχείο <strong>γραμμή-προς-γραμμή</strong> με λεπτομερή έλεγχο, συχνά μέσα σε έναν βρόχο (π.χ., ένας βρόχος `while` που συνεχίζεται εφόσον το `.readline()` επιστρέφει μη κενές συμβολοσειρές)."},{"type":"p","text":"<ul><li>Είναι <strong>αποδοτική ως προς τη μνήμη</strong> επειδή φορτώνει μόνο μία γραμμή στη μνήμη κάθε φορά, καθιστώντας την κατάλληλη για μεγαλύτερα αρχεία όπου θέλετε να εφαρμόσετε συγκεκριμένη λογική σε κάθε γραμμή.</li><li>Ο δρομέας προχωρά στην αρχή της επόμενης γραμμής μετά από κάθε κλήση.</li></ul>"},{"type":"p","text":"<strong>Η Μέθοδος `.readlines()`</strong>"},{"type":"p","text":"Η μέθοδος `.readlines()` διαβάζει όλες τις υπόλοιπες γραμμές από την τρέχουσα θέση του δρομέα μέχρι το τέλος του αρχείου και τις επιστρέφει ως μια <strong>λίστα από συμβολοσειρές</strong>. Κάθε συμβολοσειρά στη λίστα αντιπροσωπεύει μια γραμμή από το αρχείο και συνήθως περιλαμβάνει τον χαρακτήρα νέας γραμμής (`\\\\\\\\n`) στο τέλος της."},{"type":"p","text":"Όπως το `.read()` χωρίς όρισμα, το `.readlines()` είναι επικίνδυνο για μεγάλα αρχεία. Θα προσπαθήσει να φορτώσει <strong>όλες</strong> τις υπόλοιπες γραμμές στη μνήμη ταυτόχρονα, αποθηκεύοντάς τες ως μια λίστα από συμβολοσειρές. Αυτό μπορεί γρήγορα να εξαντλήσει τη διαθέσιμη RAM εάν το αρχείο είναι σημαντικό."},{"type":"p","text":"Αυτή η μέθοδος είναι αποδεκτή για αρχεία που είναι γνωστό ότι είναι μικρά, όπου η φόρτωση όλων των γραμμών σε μια λίστα για μετέπειτα επεξεργασία (π.χ., ταξινόμηση, φιλτράρισμα ή пакетные операции) είναι βολική και δεν ενέχει κίνδυνο για τη μνήμη."},{"type":"p","text":"<strong>Επανάληψη πάνω στο Αντικείμενο Αρχείου: Ο Πυθωνικός Τρόπος</strong>"},{"type":"p","text":"Ο πιο <strong>αποδοτικός, Πυθωνικός και συνιστώμενος</strong> τρόπος για να διαβάσετε ένα αρχείο γραμμή-προς-γραμμή είναι να επαναλάβετε απευθείας πάνω στο αντικείμενο χειρισμού αρχείου χρησιμοποιώντας έναν βρόχο `for`:<br><code>for line in file_handle:    # Επεξεργαστείτε κάθε \'line\' εδώ</code>"},{"type":"p","text":"Αυτή η προσέγγιση εκμεταλλεύεται τους εσωτερικούς μηχανισμούς της Python, αντιμετωπίζοντας το αντικείμενο αρχείου ως έναν <strong>επαναλήπτη (iterator)</strong>. Δεν φορτώνει ολόκληρο το αρχείο ή ακόμα και όλες τις γραμμές στη μνήμη ταυτόχρονα. Αντ\' αυτού, διαβάζει και αποδίδει <strong>μία γραμμή κάθε φορά</strong>, κατά παραγγελία, καθώς ο βρόχος προχωρά."},{"type":"p","text":"<ul><li>Αυτή η <strong>\xabτεμπέλικη φόρτωση\xbb (lazy loading)</strong> την καθιστά απίστευτα αποδοτική ως προς τη μνήμη, ανεξάρτητα από το μέγεθος του αρχείου. Είναι η ιδανική μέθοδος για την επεξεργασία πολύ μεγάλων αρχείων χωρίς να κινδυνεύετε με εξάντληση της μνήμης.</li><li>Κάθε `line` που λαμβάνεται με αυτόν τον τρόπο θα περιλαμβάνει τον χαρακτήρα νέας γραμμής στο τέλος (`\\\\\\\\n`). Είναι κοινή πρακτική η χρήση του `line.strip()` για την αφαίρεση των αρχικών/τελικών κενών, συμπεριλαμβανομένου του χαρακτήρα νέας γραμμής, για καθαρότερη επεξεργασία.</li></ul>"},{"type":"p","text":"<strong>Βέλτιστες Πρακτικές για την Ανάγνωση Αρχείων</strong>"},{"type":"p","text":"Συνοψίζοντας, δίνετε πάντα προτεραιότητα στην <strong>αποδοτικότητα της μνήμης</strong> κατά την ανάγνωση αρχείων. Για τα περισσότερα σενάρια, ειδικά όταν το μέγεθος του αρχείου είναι άγνωστο ή δυνητικά μεγάλο, η απευθείας επανάληψη πάνω στο αντικείμενο του αρχείου (`for line in file_handle:`) είναι η ανώτερη επιλογή. Χρησιμοποιήστε το `.readline()` όταν χρειάζεστε ακριβή, χειροκίνητο έλεγχο στην ανάγνωση γραμμή-προς-γραμμή. Κρατήστε τα `.read()` και `.readlines()` για καταστάσεις όπου είστε απολύτως βέβαιοι ότι το αρχείο είναι αρκετά μικρό για να χωρέσει άνετα στη μνήμη, ή όταν διαβάζετε συγκεκριμένα, μικρά κομμάτια δεδομέÎ
1½Ï‰Î½ με το `.read(size)`."},{"type":"h3","text":"6.3.2 Παράδειγμα"},{"type":"code","code":"# Δημιουργία ενός αρχείου για демонстрация\\nwith open(\'sample_log.txt\', \'w\', encoding=\'utf-8\') as f:\\n    f.write(\\"2025-09-21 12:30: INFO - System startup\\\\n\\")\\n    f.write(\\"2025-09-21 12:31: WARNING - Low disk space\\\\n\\")\\n    f.write(\\"2025-09-21 12:32: INFO - User \'admin\' logged in\\\\n\\")\\n\\n# -- Επίδειξη των μεθόδων --\\nprint(\\"--- Χρήση .read() ---\\")\\nwith open(\'sample_log.txt\', \'r\', encoding=\'utf-8\') as f:\\n    full_content = f.read()\\n    print(full_content)\\n\\nprint(\\"--- Χρήση .readlines() ---\\")\\nwith open(\'sample_log.txt\', \'r\', encoding=\'utf-8\') as f:\\n    lines_list = f.readlines()\\n    print(lines_list) # Εκτυпώνει μια λίστα\\n\\nprint(\\"--- Ο σωστός, αποδοτικός τρόπος (iteration) ---\\")\\nwith open(\'sample_log.txt\', \'r\', encoding=\'utf-8\') as f:\\n    for line in f:\\n        # Επεξεργαζόμαστε κάθε γραмμή ξεχωριστά\\n        if \\"WARNING\\" in line:\\n            print(f\\"Εντοπίστηκε προειδοποίηση: {line.strip()}\\")"}]},{"slug":"writing-methods","title":"6.4 Μέθοδοι Εγγραφής Αρχείων","description":"Μαθαίνουμε πώς να γράφουμε δεδομένα σε αρχεία, δίνοντας προσοχή στους τύπους δεδομένων και τους χαρακτήρες νέας γραμμής.","course":"python","content":[{"type":"h3","text":"6.4.1 Θεωρία"},{"type":"p","text":"<strong>Αναμενόμενοι Τύποι Δεδομένων:</strong><br>Είναι κρίσιμο να θυμόμαστε ότι σε λειτουργία κειμένου, οι μέθοδοι εγγραφής αναμένουν συμβολοσειρές (str). Σε δυαδική λειτουργία, αναμένουν αντικείμενα τύπου bytes (bytes-like objects). Η προσπάθεια εγγραφής λανθασμένου τύπου θα προκαλέσει `TypeError`."},{"type":"p","text":"<strong>Σύγκριση Μεθόδων:</strong><br><ul><li><strong>`.write(string)`:</strong> Γράφει τη δοθείσα συμβολοσειρά στο αρχείο, στην τρέχουσα θέση του δρομέα. <strong>Σημαντική Σημείωση:</strong> Η `.write()` <strong>ΔΕΝ</strong> προσθέτει αυτόματα τον χαρακτήρα νέας γραμμής (`\\\\\\\\n`). Πρέπει να τον προσθέσετε ρητά στη συμβολοσειρά σας αν θέλετε να δημιουργήσετε διακριτές γραμμές.</li><li><strong>`.writelines(iterable_of_strings)`:</strong> Δέχεται ένα iterable (π.χ., μια λίστα) από συμβοлоσειρές και τις γράφει στο αρχείο τη μία μετά την άλλη. <strong>Προσοχή:</strong> Παρά το όνομά της, ούτε αυτή η μέθοδος προσθέτει χαρακτήρες νέας γραμμής μεταξύ των στοιχείων. Είναι απλώς μια βελτιστοποιημένη μέθοδος για την εκτέλεση πολλαπλών `write` χωρίς να χρειάζεται ρητός βρόχος.</li></ul>"},{"type":"h3","text":"6.4.2 Παράδειγμα"},{"type":"code","code":"report_lines = [\\n    \\"Αναφορά Πωλήσεων Σεπτεμβρίου 2025\\",\\n    \\"====================================\\",\\n    \\"Προϊόν Α: 150 μονάδες\\",\\n    \\"Προϊόν Β: 220 μονάδες\\",\\n    \\"Σύνολο: 370 μονάδες\\"\\n]\\n\\n# Χρήση .writelines() απαιτεί τη μη αυτόματη προσθήκη του \'\\\\n\'\\nlines_with_newlines = [line + \'\\\\n\' for line in report_lines]\\n\\nwith open(\'report.txt\', \'w\', encoding=\'utf-8\') as f:\\n    f.writelines(lines_with_newlines)\\n\\nprint(\\"Το αρχείο \'report.txt\' δημιουργήθηκε.\\")\\n\\n# Εναλλακτικά, με .write() μέσα σε βρόχο\\nwith open(\'report_alt.txt\', \'w\', encoding=\'utf-8\') as f:\\
1n    for line in report_lines:\\n        f.write(line + \'\\\\n\')\\n\\nprint(\\"Το αρχείο \'report_alt.txt\' δημιουργήθηκε.\\")"}]},{"slug":"error-handling","title":"6.5 Διαχείριση Σφαλμάτων (Error Handling)","description":"Οι λειτουργίες I/O είναι από τις πιο επισφαλείς σε ένα πρόγραμμα, καθώς εξαρτώνται από το εξωτερικό περιβάλλον. Η σωστή διαχείριση σφαλμάτων είναι απαραίτητη για τη δημιουργία ανθεκτικών εφαρμογών.","course":"python","content":[{"type":"h3","text":"6.5.1 Θεωρία"},{"type":"p","text":"<strong>Η Φύση των Σφαλμάτων I/O:</strong><br>Ένα σφάλμα κατά τον χειρισμό αρχείων δεν είναι ένα λογικό σφάλμα του προγράμματος, αλλά μια εξαίρεση (exception) που προκύπτει από μια κατάσταση την οποία το πρόγραμμα δεν μπορεί να ελέγξει: το αρχείο δεν υπάρχει, το λειτουργικό σύστημα αρνείται την πρόσβαση, ο δίσκος είναι γεμάτος. Η Python χρησιμοποιεί τον μηχανισμό των εξαιρέσεων για να σηματοδοτήσει αυτές τις ανώμαλες καταστάσεις."},{"type":"p","text":"<strong>Κοινές Εξαιρέσεις I/O:</strong><br><ul><li>`FileNotFoundError`: Η πιο συχνή. Προκύπτει όταν προσπαθείτε να ανοίξετε ένα αρχείο σε λειτουργία ανάγνωσης (\'r\') που δεν υπάρχει.</li><li>`PermissionError`: Το πρόγραμμα δεν έχει τα απαραίτητα δικαιώματα από το λειτουργικό σύστημα για να διαβάσει ή να γράψει στο συγκεκριμένο αρχείο ή κατάλογο.</li><li>`IsADirectoryError`: Προσπαθείτε να ανοίξετε έναν κατάλογο σαν να ήταν αρχείο.</li><li>`io.UnsupportedOperation`: Προσπαθείτε να εκτελέσετε μια λειτουργία που δεν υποστηρίζεται από την τρέχουσα λειτουργία ανοίγματος (π.χ., `write()` σε αρχείο που ανοίχτηκε με \'r\').</li></ul>"},{"type":"p","text":"<strong>Το Μπλοκ try...except:</strong><br>Αυτή η δομή είναι ο κανονικός μηχανισμός της Python για τη \\\\\\"σύλληψη\\\\\\" (catching) και τον χειρισμό εξαιρέσεων.<br>1. Ο κώδικας που ενδέχεται να προκαλέσει σφάλμα τοποθετείται μέσα στο μπλοκ `try`.<br>2. Αν κατά την εκτέλεση του `try` προκύψει μια εξαίρεση, η κανονική ροή διακόπτεται και ο διερμηнέας ψάχνει για ένα μπλοκ `except` που ταιριάζει με τον τύπο της εξαίρεσης.<br>3. Αν βρεθεί, εκτελείται ο κώδικας του `except` και το πρόγραμμα συνεχίζει μετά το μπλοκ `try-except`, αντί να τερματιστεί βίαια."},{"type":"h3","text":"6.5.2 Παράδειγμα"},{"type":"code","code":"# Το input() δεν λειτουργεί σε αυτό το περιβάλλον, οπότε προσομοιώνουμε.\\nfile_path = \\"non_existent_file.txt\\" \\n\\ntry:\\n    # Συνδυάζουμε την ασφάλεια του \'with\' με την ανθεκτικότητα του \'try...except\'\\n    with open(file_path, \'r\', encoding=\'utf-8\') as f:\\n        print(\\"\\\\n--- Περιεχόμενο Αρχείου ---\\")\\n        content = f.read()\\n        print(content)\\n        print(\\"--------------------------\\")\\n\\nexcept FileNotFoundError:\\n    print(f\\"Σφάλμα: Το αρχείο στη διαδρομή \'{file_path}\' δεν βρέθηκε.\\")\\nexcept PermissionError:\\n    print(f\\"Σφάλμα: Δεν υπάρχουν τα απαραίτητα δικαιώματα για την ανάγνωση του αρχείου \'{file_path}\'.\\")\\nexcept Exception as e:\\n    # Ένα γενικό \'except\' για να πιάσει οποιοδήποτε άλλο απρόβλεпτο σφάλμα\\n    print(f\\"Προέκυψε ένα μη αναμενόμενο σφάλμα: {e}\\")\\n\\nprint(\\"\\\\nΗ εκτέλεση του προγράμματος συνεχίζεται ομαλά.\\")"}]}]}')}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.