Λύσεις — Κεφάλαιο 6: Διαχείριση Αρχείων (σελ. 100-102) – ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ Γ΄ ΕΠΑΛ

Λύσεις — Κεφάλαιο 6: Διαχείριση Αρχείων (σελ. 100-102)

Λύσεις των 4 Δραστηριοτήτων (κώδικας Python και ανάλυση σεναρίων) και των 7 Ερωτήσεων του κεφαλαίου 6.


Δραστηριότητα 1 — Αντιγραφή αρχείου με αύξοντα αριθμό σε κάθε γραμμή

Ερώτηση: Ας πειραματιστούμε γράφοντας κώδικα σε Python, ο οποίος διαβάζει το αρχείο “input_file.txt” και το ξαναγράφει στο νέο αρχείο “output_file.txt”, όπου πριν από κάθε γραμμή θα προσθέτει τον αύξοντα αριθμό της. Τα αρχεία θεωρούμε ότι βρίσκονται στον τρέχοντα κατάλογο “TxtFiles”.

Απάντηση:

  • Ανοίγουμε το αρχείο εισόδου για ανάγνωση («r») και το αρχείο εξόδου για εγγραφή («w» — δημιουργείται ή αδειάζει)· με σχετική διαδρομή «TxtFiles/…» (υποφάκελος του τρέχοντος καταλόγου). Σαρώνουμε το αρχείο κατά γραμμές με for line in inputfile και γράφουμε κάθε γραμμή με μπροστά τον μετρητή (μετατροπή του αριθμού σε συμβολοσειρά με str, γιατί η write δέχεται μόνο συμβολοσειρές). Η μεταβλητή line περιέχει ήδη το \n της γραμμής, οπότε δεν προσθέτουμε άλλο. Στο τέλος κλείνουμε και τα δύο αρχεία:
  • inputfile = open("TxtFiles/input_file.txt", "r")
    outputFile = open("TxtFiles/output_file.txt", "w")
    linecounter = 1
    for line in inputfile:
        outputFile.write(str(linecounter) + ". " + line)
        linecounter = linecounter + 1
    inputfile.close()
    outputFile.close()
  • Παράδειγμα: αν το input_file.txt περιέχει «This is line 1 / This is line 2 / This is line 3», το output_file.txt γίνεται «1. This is line 1 / 2. This is line 2 / 3. This is line 3».
  • Παρατηρήσεις: αν η τελευταία γραμμή του αρχείου εισόδου δεν τελειώνει με \n, ούτε η αντίστοιχη γραμμή εξόδου θα τελειώνει· αν ο φάκελος TxtFiles ή το αρχείο εισόδου δεν υπάρχουν, η open() προκαλεί σφάλμα (IOError).

Σύνοψη: open εισόδου "r" και εξόδου "w" στον φάκελο TxtFiles· for line in inputfile: outputFile.write(str(linecounter) + ". " + line) και αύξηση του μετρητή· close() και στα δύο.

Κριτήρια αξιολόγησης:

  • Σωστοί τρόποι προσπέλασης, str() στον μετρητή, κλείσιμο αρχείων.

Δραστηριότητα 2 — Το demo.py μετρά τις γραμμές του εαυτού του

Ερώτηση: Υποθέτουμε ότι έχουμε ένα πρόγραμμα σε Python που έχει αποθηκευθεί στο αρχείο με όνομα demo.py και με τον ακόλουθο κώδικα: def linecount(filename): / count = 0 / for line in open(filename): / count += 1 / return count / print linecount('demo.py'). Εκτελέστε το παραπάνω πρόγραμμα και συζητήστε το αποτέλεσμα. Υπόδειξη: Το αποτέλεσμα είναι ότι θα εμφανίσει το πλήθος των γραμμών του αρχείου.

Απάντηση:

  • Τι κάνει η συνάρτηση: η linecount(filename) ανοίγει το αρχείο με open(filename) (προεπιλογή «r») απευθείας μέσα στη for, διατρέχει τις γραμμές του μία-μία και αυξάνει τον μετρητή count σε κάθε γραμμή· επιστρέφει το πλήθος των γραμμών.

  • Τι εμφανίζει: η print linecount('demo.py') δίνει ως όρισμα το ίδιο το αρχείο του προγράμματος. Το demo.py, όπως είναι γραμμένο, έχει 6 γραμμές (def, count = 0, for, count += 1, return, print) → η εκτέλεση εμφανίζει 6. Αν προσθέσουμε κενές γραμμές ή σχόλια, ο αριθμός αλλάζει αντίστοιχα — μετρά όλες τις γραμμές, όχι μόνο τις εντολές.

  • Συζήτηση: ① ένα αρχείο .py είναι κι αυτό αρχείο κειμένου, άρα διαβάζεται όπως κάθε άλλο (δύο τύποι αρχείων, σελ. 91)· ② το open() μέσα στη for λειτουργεί επειδή το αντικείμενο αρχείου είναι επαναλήψιμο κατά γραμμές· ③ δεν καλείται close() — κακή πρακτική: το αρχείο μένει ανοιχτό μέχρι να το απελευθερώσει η Python· σωστότερα f = open(filename)f.close()· ④ η συνάρτηση είναι γενική: linecount('words.txt') → 3 για το αρχείο της ενότητας 6.2.

  • def linecount(filename):
        f = open(filename)          # "r"
        count = 0
        for line in f:
            count += 1
        f.close()
        return count
    
    print linecount('demo.py')      # 8 (με τη νέα διάταξη 8 γραμμών)

Σύνοψη: Εμφανίζει το πλήθος των γραμμών του demo.py (6 για τον δοσμένο κώδικα): η συνάρτηση ανοίγει το αρχείο, μετρά με for line in … και επιστρέφει τον μετρητή· το .py διαβάζεται ως αρχείο κειμένου· λείπει το close().

Κριτήρια αξιολόγησης:

  • Σωστός αριθμός (6) + εξήγηση ότι μετρά όλες τις γραμμές + παρατήρηση για το close().

Δραστηριότητα 3 — Εμφάνιση κατά γραμμή και εγγραφή με αντίστροφη σειρά

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

Απάντηση:

  • Σχέδιο: ① διαβάζουμε το όνομα με raw_input (συμβολοσειρά)· ② ανοίγουμε για ανάγνωση, εμφανίζουμε κάθε γραμμή και ταυτόχρονα την αποθηκεύουμε σε λίστα (χρειαζόμαστε όλες τις γραμμές για να τις γράψουμε ανάποδα)· ③ ανοίγουμε το δεύτερο αρχείο για εγγραφή και γράφουμε τα στοιχεία της λίστας από το τέλος προς την αρχή (range(len(lines)-1, -1, -1))· ④ κλείνουμε τα αρχεία.

  • # Εμφάνιση αρχείου κατά γραμμή και εγγραφή των γραμμών του αντίστροφα
    name = raw_input("Δώσε το όνομα του αρχείου: ")
    fin = open(name, "r")
    lines = []
    for line in fin:
        print line,            # το κόμμα αποφεύγει τη διπλή αλλαγή γραμμής (η line έχει \n)
        lines.append(line)
    fin.close()
    
    fout = open("reversed_" + name, "w")
    for i in range(len(lines) - 1, -1, -1):
        fout.write(lines[i])
    fout.close()
    print "Οι γραμμές γράφτηκαν αντίστροφα στο αρχείο", "reversed_" + name
  • Παράδειγμα: για το words.txt («This is line 1 / This is line 2 / This is line 3») εμφανίζει τις τρεις γραμμές και το reversed_words.txt περιέχει «This is line 3 / This is line 2 / This is line 1».

  • Λεπτομέρειες: αν η τελευταία γραμμή του αρχείου δεν έχει \n, στο αντίστροφο αρχείο θα «κολλήσει» με την επόμενη — μπορούμε να το αποφύγουμε προσθέτοντας \n όπου λείπει (if not line.endswith('\n'): line += '\n'). Εναλλακτικά για την αντιστροφή: lines.reverse() και μετά for line in lines: fout.write(line), ή μια στοίβα (κεφ. 8). Python 3: input() αντί raw_input(), print(line, end='').

Σύνοψη: raw_input για το όνομα· open "r", for line in fin: print + append σε λίστα· open δεύτερου αρχείου "w" και write των στοιχείων της λίστας με range(len−1, −1, −1)· close().

Κριτήρια αξιολόγησης:

  • Αποθήκευση γραμμών σε λίστα + αντίστροφος βρόχος + σωστοί τρόποι προσπέλασης.

Δραστηριότητα 4 — Τι θα συμβεί στο σενάριο (τετράγωνα σε αρχείο, readline και read)

Ερώτηση: Τι πιστεύετε ότι θα συμβεί, όταν θα εκτελεστούν τα παρακάτω σενάρια. Τεκμηριώστε την άποψή σας. (my_list = [i**2 for i in range(1,11)] / f = open("output.txt", "w") / for item in my_list: f.write(str(item) + "\n") / f.close() / f = open("output.txt", "r") / print f.readline() / print f.read() / f.close() — σελ. 102)

Απάντηση:

  • Γραμμή προς γραμμή:my_list = [i**2 for i in range(1,11)] δημιουργεί (με «list comprehension») τη λίστα των τετραγώνων των 1…10: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]. ② open('output.txt', «w») δημιουργεί (ή αδειάζει, αν υπάρχει) το αρχείο. ③ Ο βρόχος γράφει κάθε τετράγωνο ως συμβολοσειρά (str(item), γιατί η write δεν δέχεται αριθμούς) ακολουθούμενο από αλλαγή γραμμής — το αρχείο αποκτά 10 γραμμές: 1, 4, 9, …, 100. ④ close() αποθηκεύει οριστικά τα δεδομένα.

  • ⑤ Ανοίγουμε ξανά για ανάγνωση. ⑥ print f.readline() διαβάζει την πρώτη γραμμή «1\n» και την τυπώνει· επειδή η γραμμή περιέχει ήδη \n και η print προσθέτει δική της αλλαγή γραμμής, εμφανίζεται το 1 και μετά μία κενή γραμμή. ⑦ print f.read() διαβάζει το υπόλοιπο αρχείο από την τρέχουσα θέση (το αντικείμενο θυμάται πού έμεινε — σελ. 96) → τυπώνει τις γραμμές 4 έως 100, μία σε κάθε γραμμή, και στο τέλος πάλι μια κενή γραμμή. ⑧ close().

  • Έξοδος στην οθόνη:

  • 1
    
    4
    9
    16
    25
    36
    49
    64
    81
    100
  • Τεκμηρίωση: η readline και η read δεν ξεκινούν από την αρχή αλλά από τη θέση που έχει αφήσει η προηγούμενη ανάγνωση (fin.tell/seek, σελ. 96-97)· αν θέλαμε ξανά όλο το αρχείο θα καλούσαμε f.seek(0) πριν το read(). Αν το αρχείο ανοιγόταν με «a» αντί για «w» σε δεύτερη εκτέλεση, τα τετράγωνα θα προστίθεντο μετά τα παλιά (20 γραμμές).

Σύνοψη: Δημιουργείται το output.txt με 10 γραμμές (τα τετράγωνα 1…100)· η readline τυπώνει την πρώτη γραμμή «1» (+ κενή γραμμή λόγω \n) και η read το υπόλοιπο, 4 έως 100, γιατί η ανάγνωση συνεχίζει από την τρέχουσα θέση.

Κριτήρια αξιολόγησης:

  • Περιεχόμενο αρχείου + ακριβής έξοδος + εξήγηση της θέσης ανάγνωσης και του διπλού \n.

Ερώτηση 1 — Σε τι χρησιμεύει ένα αρχείο δεδομένων

Ερώτηση: Σε τι χρησιμεύει ένα αρχείο δεδομένων;

Απάντηση:

  • Ένα αρχείο δεδομένων χρησιμεύει για τη μόνιμη αποθήκευση των δεδομένων ενός προγράμματος σε μέσο μόνιμης αποθήκευσης (π.χ. σκληρό δίσκο), ώστε να μη χάνονται μετά το τέλος της εκτέλεσης (σελ. 90-91).
  • Τα δεδομένα στην κύρια μνήμη (είσοδος από πληκτρολόγιο, μεταβλητές) διαρκούν μόνο όσο τρέχει το πρόγραμμα — τα προγράμματα είναι «προσωρινά» και τα δεδομένα πρέπει να δίνονται ξανά σε κάθε εκτέλεση. Με ένα αρχείο, το πρόγραμμα διαβάζει τα δεδομένα από αυτό όταν εκτελείται, τα επεξεργάζεται και πιθανώς τα ενημερώνει ή γράφει αποτελέσματα στο ίδιο ή σε άλλο αρχείο (Είσοδος/Έξοδος Αρχείου). Διακρίνεται από τα αρχεία που περιέχουν το πρόγραμμα. Συνήθως είναι αρχείο κειμένου — ακολουθία χαρακτήρων προσπελάσιμη με τις εντολές της Python.

Σύνοψη: (ενδεικτική) Για μόνιμη αποθήκευση δεδομένων σε αποθηκευτικό μέσο, ώστε να μη χάνονται μετά την εκτέλεση και να μπορούν να διαβαστούν/ενημερωθούν από το πρόγραμμα (σε αντίθεση με τα προσωρινά δεδομένα της κύριας μνήμης).

Κριτήρια αξιολόγησης:

  • Μονιμότητα vs κύρια μνήμη + ανάγνωση/ενημέρωση.

Ερώτηση 2 — Βασικές λειτουργίες/μέθοδοι της Python για αρχεία

Ερώτηση: Ποιες βασικές λειτουργίες - μεθόδους υποστηρίζει η γλώσσα προγραμματισμού Python για τη διαχείριση αρχείων;

Απάντηση:

  • Άνοιγμα και κλείσιμο: open(όνομα, τρόπος) — επιστρέφει αντικείμενο αρχείου, με τρόπους προσπέλασης «r» (ανάγνωση), «w» (εγγραφή, διαγράφει), «a» (προσθήκη), «r+» (ανάγνωση και εγγραφή)· close() — κλείσιμο (απαραίτητο)· ιδιότητα closed.
  • Εγγραφή: write(συμβολοσειρά) (αριθμοί με str(), γραμμές με '\n').
  • Ανάγνωση: read([count]) (count χαρακτήρες ή όλο το υπόλοιπο), readline() (μία γραμμή), και σάρωση for line in αρχείο.
  • Θέση στο αρχείο: tell() (τρέχουσα θέση), seek(offset, from_what) (μετακίνηση: 0 αρχή, 1 τρέχουσα, 2 τέλος).
  • Χαρακτηριστικά: closed, mode, name.
  • Άρθρωμα os (αρχεία και κατάλογοι): rename(), remove(), mkdir(), chdir(), getcwd(), rmdir().

Σύνοψη: (ενδεικτική) open (r/w/a/r+), close/closed· write· read/readline/for line in· tell/seek· mode/name· os.rename, remove, mkdir, chdir, getcwd, rmdir.

Κριτήρια αξιολόγησης:

  • Ομαδοποιημένη απαρίθμηση: άνοιγμα-κλείσιμο, εγγραφή, ανάγνωση, θέση, os.

Ερώτηση 3 — Άνοιγμα αρχείου για ανάγνωση

Ερώτηση: Με ποια συνάρτηση (μέθοδο) ανοίγουμε ένα αρχείο για ανάγνωση;

Απάντηση:

  • Με την ενσωματωμένη συνάρτηση open() με δεύτερο όρισμα «r»: fin = open('words.txt', «r»). Επειδή το «r» είναι η προεπιλογή, αρκεί και fin = open('words.txt') (σελ. 91, 96).
  • Η open επιστρέφει το αντικείμενο αρχείου (περιγραφέα), μέσω του οποίου διαβάζουμε με read()/readline()/for line in και τέλος καλούμε close(). Για ανάγνωση και εγγραφή ταυτόχρονα χρησιμοποιούμε «r+».

Σύνοψη: open("όνομα", "r") — ή απλώς open("όνομα"), αφού το "r" είναι προεπιλογή.

Κριτήρια αξιολόγησης:

  • open + όρισμα r + ότι είναι προεπιλογή.

Ερώτηση 4 — Άνοιγμα αρχείου για εγγραφή

Ερώτηση: Πώς ανοίγουμε ένα αρχείο για εγγραφή;

Απάντηση:

  • Με την open() και όρισμα τρόπου προσπέλασης «w»: fin = open('words.txt', «w»). Αν το αρχείο δεν υπάρχει, δημιουργείται· αν υπάρχει, τα περιεχόμενά του διαγράφονται (σελ. 92).
  • Αν θέλουμε να διατηρήσουμε τα υπάρχοντα περιεχόμενα και να προσθέσουμε στο τέλος, ανοίγουμε με «a» (append): open('words.txt', «a») — επίσης δημιουργεί το αρχείο αν δεν υπάρχει. Με «r+» το αρχείο ανοίγει για ανάγνωση και εγγραφή. Μετά το άνοιγμα γράφουμε με write() και κλείνουμε με close().

Σύνοψη: open("όνομα", "w") — δημιουργεί το αρχείο ή διαγράφει τα παλιά περιεχόμενα· open("όνομα", "a") για προσθήκη στο τέλος χωρίς διαγραφή.

Κριτήρια αξιολόγησης:

  • w vs a, με τη συνέπεια στο υπάρχον περιεχόμενο.

Ερώτηση 5 — Κλείσιμο αρχείου

Ερώτηση: Με ποια συνάρτηση κλείνουμε ένα αρχείο;

Απάντηση:

  • Με τη μέθοδο close() του αντικειμένου αρχείου: fin.close() (σελ. 93).
  • Είναι απαραίτητη όταν ολοκληρώσουμε τις λειτουργίες: δηλώνει ότι τελειώσαμε με το αρχείο και οδηγεί το Λειτουργικό Σύστημα να αποθηκεύσει τα δεδομένα που βρίσκονται ακόμη στη μνήμη και να περατώσει τις διεργασίες του — παρόμοια με File→Save· επίσης απελευθερώνει πόρους του συστήματος (σελ. 96). Ελέγχουμε αν έκλεισε με την ιδιότητα closed (fin.closed → True).

Σύνοψη: close() — π.χ. fin.close()· αποθηκεύει ό,τι είναι στη μνήμη και απελευθερώνει πόρους· έλεγχος με fin.closed.

Κριτήρια αξιολόγησης:

  • close() + γιατί είναι απαραίτητο.

Ερώτηση 6 — Εγγραφή περιεχομένου σε αρχείο

Ερώτηση: Με ποια συνάρτηση γράφουμε περιεχόμενο σε ένα αρχείο;

Απάντηση:

  • Με τη μέθοδο write(), που δέχεται ως όρισμα τη συμβολοσειρά που θέλουμε να εισαχθεί: fin.write('This is line 4\n') (σελ. 94). Το αρχείο πρέπει να έχει ανοιχτεί με «w», «a» ή «r+».
  • Για γραμμές σημειώνουμε την αλλαγή γραμμής με τον χαρακτήρα '\n'. Αν θέλουμε να γράψουμε αριθμό, τον μετατρέπουμε πρώτα σε συμβολοσειρά με str(): x = 52 / keimeno.write(str(x)).

Σύνοψη: write(συμβολοσειρά) — π.χ. fin.write("This is line 4\n")· αριθμοί με str(), αλλαγή γραμμής με \n.

Κριτήρια αξιολόγησης:

  • write + όρισμα συμβολοσειρά + str/\n.

Ερώτηση 7 — Ανάγνωση μιας γραμμής από αρχείο

Ερώτηση: Ποια συνάρτηση μπορούμε να χρησιμοποιήσουμε για να διαβάσουμε δεδομένα από μία γραμμή, από ένα αρχείο;

Απάντηση:

  • Τη μέθοδο readline(): διαβάζει διαδοχικούς χαρακτήρες από το αρχείο μέχρι να συναντήσει τον χαρακτήρα νέας γραμμής και επιστρέφει τη γραμμή ως συμβολοσειρά: print fin.readline() → «This is line 1» (σελ. 96).
  • Το αντικείμενο αρχείου καταγράφει τη θέση του, οπότε κάθε επόμενη κλήση της readline επιστρέφει την επόμενη γραμμή («This is line 2»). Για όλες τις γραμμές διαδοχικά χρησιμοποιούμε τη δομή επανάληψης for line in fin: print line. (Η read() διαβάζει χαρακτήρες — read(count) — ή όλο το υπόλοιπο, όχι κατά γραμμή.)

Σύνοψη: readline() — διαβάζει ως τον χαρακτήρα νέας γραμμής και επιστρέφει τη γραμμή· η επόμενη κλήση δίνει την επόμενη γραμμή· εναλλακτικά for line in αρχείο.

Κριτήρια αξιολόγησης:

  • readline + συμπεριφορά θέσης.

 ΣΧΟΛΙΚΟ ΒΙΒΛΙΟ