Μάθημα : Προγραμματισμός Η/Υ

Κωδικός : T522234

T522234  -  ΔΗΜΗΤΡΙΟΣ ΜΠΑΜΠΑΣ

Ενότητες μαθήματος - Διαχείριση Αρχείων

Διαχείριση Αρχείων

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

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

ΠεριγραφέαΑρχείου=open (“όνομα_αρχείου”, “τρόπος προσπέλασης”)

Το όνομα αρχείου είναι το όνομα (ή διαδρομή) του αρχείου στο δίσκο. Τρόπος προσπέλασης του αρχείου μπορεί να είναι
r” Ανάγνωση
w” Εγγραφή (διαγραφή προηγούμενων περιεχομένων, αν υπάρχουν)
a” Προσθήκη (append) (διατήρηση προηγούμενων περιεχομένων)
r+” Άνοιγμα αρχείου και για ανάγνωση και για εγγραφή

Κλείσιμο αρχείου
ΠεριγραφέαΑρχείου.close()

Εγγραφή σε αρχείο
ΠεριγραφέαΑρχείου.write('όρισμα όρισμα όρισμα ')

όρισμα είναι η συμβολοσειρά που θέλουμε να εισάγουμε στο αρχείο.

\n” Αλλαγή γραμμής
Προσοχή: Το όρισμα  πρέπει να είναι συμβολοσειρά.

Ανάγνωση αρχείου
ΠεριγραφέαΑρχείου.read([αριθμός])
Εδώ, ο αριθμός καθορίζει πόσους χαρακτήρες θα διαβασθούν από το αρχείο, ξεκινώντας την ανάγνωση από το σημείο που βρίσκεται.

ΠεριγραφέαΑρχείου.readline ()
Διαβάζει διαδοχικούς χαρακτήρες από ένα αρχείο μέχρι να συναντήσει το χαρακτήρα νέας γραμμής και επιστρέφει το αποτέλεσμα.


Για ανάγνωση αλλά και εγγραφή, κατά γραμμές, από ένα αρχείο μπορούμε να "τρέξουμε" με μια δομή επανάληψης το αρχείο. Για παράδειγμα, για να τυπώσουμε τις γραμμές του αρχείου γράφουμε:
for line in fin:
        print line

 

Εντοπισμός θέσης μέσα στο αρχείο
ΠεριγραφέαΑρχείου.tell()
Επιστρέφει έναν ακέραιο που περιέχει την τρέχουσα θέση στο αρχείο, υπολογισμένη σε χαρακτήρες (bytes) από την αρχή του αρχείου.

 

Μετακίνηση θέσης μέσα στο αρχείο
ΠεριγραφέαΑρχείου.seek() (offset[, from_what])
αλλάζει την τρέχουσα θέση του αρχείου. Η νέα θέση υπολογίζεται προσθέτοντας offset (πλήθος bytes) σε ένα σημείο αναφοράς, το οποίο επιλέγεται από το from_what όρισμα.
from_what
0 μετρά από την αρχή του αρχείου,
1 μετρά απότην τρέχουσα θέση του αρχείου και
2 μετρά από το τέλος του αρχείου.

Άλλες εντολές

ΠεριγραφέαΑρχείου.closed
Επιστρέφει true, αν το αρχείο είναι κλειστό, false, σε διαφορετική περίπτωση.

[εκτός ύλης...............................................................]
ΠεριγραφέαΑρχείου.mode
Επιστρέφει τον τρόπο προσπέλασης στο αρχείο που έχουμε ανοίξει.

ΠεριγραφέαΑρχείου.name
Επιστρέφει το όνομα του αρχείου

Βιβλιοθήκη os
έχει συναρτήσεις σχετικές με ερργασίες αρχείων και καταλόγων.
Για να χρησιμοποιήσουμε πρέπει πρώτα να το εισάγουμε και μετά να καλέσουμε τις σχετικές συναρτήσεις.
>>> import os

rename(ΤρέχονΌνομα, ΝέοΌνομα)
για μετονομασία αρχείου. Δέχεται δύο ορίσματα, ένα για το τρέχον και ένα για το νέο όνομα του αρχείου.

remove(ΌνομαΑρχείου)
για τη διαγραφή αρχείων. Δέχεται ως όρισμα το όνομα του αρχείου προς διαγραφή.

mkdir(ΌνομαΚαταλόγου)
δημιουργεί (υπο)καταλόγους στον τρέχοντα κατάλογο και δέχεται ως όρισμα το όνομα του καταλόγου που θα δημιουργηθεί.

chdir(ΌνομαΚαταλόγου)
αλλάζει τον τρέχοντα κατάλογο.

getcwd()
Επιστρέφει τον τρέχοντα κατάλογο εργασίας.

rmdir(ΌνομαΚαταλόγου)
Διαγράφει το φάκελο που δίνουμε ως όρισμα. Πριν διαγραφεί ο φάκελος, όλα τα περιεχόμενά του διαγράφονται.

 

 

 

 

 

 

Παραδείγματα
>>> files=open('arxeio.txt','w')

>>> files.write('11')
>>> files.close()
>>> files=open('arxeio.txt','a')
>>> for i in range(5):
               files.write(str(input('δώσε τον αριθμό ')))

δώσε τον αριθμό 15            
δώσε τον αριθμό 25
δώσε τον αριθμό 36
δώσε τον αριθμό 17
δώσε τον αριθμό 19
>>> files.close()
>>> files=open('arxeio.txt','a')
>>> for i in range(5):
               files.write(str(input('δώσε τον αριθμό '))+',')

δώσε τον αριθμό 89
δώσε τον αριθμό 69
δώσε τον αριθμό 47
δώσε τον αριθμό 23
δώσε τον αριθμό 11
>>> files.close()
>>> files=open('arxeio.txt','a')
>>> for i in range(5):
               files.write(str(input('δώσε τον αριθμό '))+'\n')

δώσε τον αριθμό 4111
δώσε τον αριθμό 2589
δώσε τον αριθμό 3698
δώσε τον αριθμό 788
δώσε τον αριθμό 4444
>>> files.close()
>>> thessaloniki=open('arxeio.txt', 'r')
>>> print thessaloniki.read(2)
11
>>> print thessaloniki.read(2)
15
>>> print thessaloniki.read(2)
25
>>> print thessaloniki.read(10)
36171989,6
>>> for line in thessaloniki:
                   print line

9,47,23,11,4111

2589

3698

788

4444

>>> thessaloniki.close()
>>> a=open('arxeio.txt', 'r')
>>> for i in a:
            print i

11152536171989,69,47,23,11,4111

2589

3698

788

4444

>>> a.close()
>>> a=open('arxeio.txt','r')
>>> print a.readline()
11152536171989,69,47,23,11,4111

>>> print a.readline()
2589

>>> print a.readline()
3698

>>>

Ασκήσεις

ΘΕΜΑ Δ
Δίνεται αρχείο "pth.txt" το οποίο περιέχει ονόματα πόλεων και τη μέγιστη θερμοκρασία τους σε μία συγκεκριμένη ημέρα. Το αρχείο έχει την παρακάτω δομή (ενδεικτικά):
Πάτρα
25
Λάρισα
27
...
Συνεπώς οι γραμμές που βρίσκονται σε περιττές θέσεις περιέχουν ονόματα πόλεων και οι γραμμές που βρίσκονταισε άρτιες θέσεις περιέχουν σε ακέραιο αριθμό τη μέγιστη θερμοκρασία της πόλης.
Να αναπτύξετε πρόγραμμα σε γλώσσα προγραμματισμού Python, το οποίο:
Δ1. Να διαβάζει το αρχείο "pth.txt" γραμμή προς γραμμή και ανάλογα αν η γραμμή είναι σε περιττή ή άρτια θέση, να καταχωρεί τα ονόματα των πόλεων σε μία λίστα POL και τις αντίστοιχες θερμοκρασίες τους σε μία λίστα THER.
Μονάδες 9
Δ2. Να υπολογίζει και να εμφανίζει το μέσο όρο των θερμοκρασιών όλων των πόλεων.
Μονάδες 5
Δ3. Να ταξινομεί τη λίστα THER με χρήση του αλγορίθμου ταξινόμησης της ευθείας ανταλλαγής (φυσαλίδα-bubble sort) σε φθίνουσα σειρά ως προς τις θερμοκρασίες αναδιατάσσοντας συγχρόνως τη λίστα POL έτσι ώστε να διατηρείται η αντιστοίχιση πόλεων-θερμοκρασιών.
Μονάδες 6
Δ4. Θεωρώντας ότι μπορεί να υπάρχουν περισσότερες από μία πόλεις με την ίδια θερμοκρασία, να εμφανίζει την υψηλότερη θερμοκρασία που έχει καταχωρηθεί και τα ονόματα των πόλεων που έχουν αυτή τη θερμοκρασία.
Μονάδες 5
Σημείωση: Θεωρήστε ότι όλα τα δεδομένα είναι ορθά.

(ΠΑΝΕΛΛΑΔΙΚΕΣ ΕΞΕΤΑΣΕΙΣ Γ΄ HMEΡΗΣΙΩΝ – Δ΄ ΕΣΠΕΡΙΝΩΝ – ΑΥΤΟΤΕΛΩΝ ΕΙΔΙΚΩΝ ΤΜΗΜΑΤΩΝ & ΤΜΗΜΑΤΩΝ ΣΥΝΔΙΔΑΣΚΑΛΙΑΣ ΕΠΑΓΓΕΛΜΑΤΙΚΩΝ ΛΥΚΕΙΩΝ ΤΕΤΑΡΤΗ 20 ΙΟΥΝΙΟΥ 2018)

Λύση Τετράδιο Εργασιών Δραστηριότητα 1
athroistis=0
lista=range(0,1002,3)
sakis=open('artious.txt','w')
for i in lista:
         sakis.write(str(i)+'\n')
sakis.close()
sakis=open('artious.txt', 'r')
for i in sakis:
          athroistis+=int(i)
sakis.close()
sakis=open('artious.txt','a')
sakis.write(str(athroistis)+'\n')
sakis.close()

Άσκηση
Για τους μαθητές ενός σχολείου είναι γνωστό ονοματεπώνυμο και βαθμός. Να γραφεί πρόγραμμα σε Python που υλοποιεί τα παρακάτω:

1. Καταχωρεί για κάθε μαθητή ονοματεπώνυμο και βαθμό σ' ένα αρχείο κειμένου που ονομάζεται "sxoleio.txt". Τα ονόματα καταχωρούνται στις περιττές γραμμές και οι βαθμοί στις άρτιες γραμμές. Η καταχώρηση τερματίζεται όταν δοθεί ως όνομα η λέξη "TELOS".

2. Διαβάζει τα ονόματα και τους βαθμούς από το αρχείο και τα εμφανίζει σε στήλες.

3. Υπολογίζει και εμφανίζει το μέσο όρο βαθμολογίας

4. Συμπληρώνει με τα στοιχεία (όνομα και βαθμός) και άλλων μαθητών το αρχείο.

5. Υπολογίζει και εμφανίζει στο νέο συμπληρωμένο αρχείο τη χαμηλότερη και την υψηλότερη βαθμολογία και εμφανίζει τα ονόματα των μαθητών. [δεν υπαρχουν μαθητές με την ίδια βαθμολογία]

 

Λύση

# _*_ coding: utf-8 -*-
#1

arxeio=open('sxoleio.txt','w')
onoma=raw_input('Ονομα:')
while onoma!='TELOS':
          vathmos=input('Βαθμος:')
          arxeio.write(onoma+'\n')
          arxeio.write(str(vathmos)+'\n')
          onoma=raw_input('Ονομα:')
arxeio.close()

#3
summa=0.0
arxeio=open('sxoleio.txt','r')
grammi=0
for i in arxeio: #διαβάζει το αρχείο
             grammi+=1
             if grammi%2==0:
                                summa+=int(i)
             arxeio.close()
mesos=summa/(grammi/2)
print 'Μέσος όρος ', mesos
#4
arxeio=open('sxoleio.txt','a')
onoma=raw_input('Ονομα:')
while onoma!='TELOS':
          vathmos=input('Βαθμος:')
          arxeio.write(onoma+'\n')
          arxeio.write(str(vathmos)+'\n')
          onoma=raw_input('Ονομα:')
arxeio.close()
#5
ipsiloteri=0
xamiloteri=20
arxeio=open('sxoleio.txt','r')
grammi=0
for i in arxeio: #διαβάζει το αρχείο
        grammi+=1
        if grammi%2==0:
                  if ipsiloteri<int(i):
                           ipsiloteri=int(i)
                  if xamiloteri>int(i):
                           xamiloteri=int(i)
arxeio.close()
print 'Max ', ipsiloteri
print 'Min ', xamiloteri

Δραστηριότητα 2. (τετράδιο εργασιών) σελ.77
Να γράψετε ένα πρόγραμμα σε Python το οποίο θα διαβάζει ένα κείμενο από ένα αρχείο και θα εμφανίζει τις λέξεις κάθε πρότασης σε αντίστροφη σειρά, δηλαδή την πρώτη λέξη τελευταία και την τελευταία πρώτη.
Δεχόμαστε ότι κάθε πρόταση τελειώνει με τελεία ‘.’ και οι λέξεις είναι χωρισμένες με ένα κενό. Δεν υπάρχουν άλλα σημεία στίξεως

arxeio=open('keimeno.txt','r')
periexomeno=arxeio.read()
arxeio.close()
lexi=''
protasi=[]
for i in range(len(periexomeno)):
            if periexomeno[i]!=' ' and periexomeno[i]!='.':
                   lexi+=periexomeno[i]
            elif periexomeno[i]==' ':
                   protasi=[lexi]+protasi
                   lexi=''
            else:
                  for x in protasi:
                      print x,
                  print '.',
                  protasi=[]