Λίστα για ψώνια Έννοιες: αρχεία- άνοιγμα- εγγραφή διάβασμα Προαπαιτούμενα : δομή επιλογής, επανάληψης, συναρτήσεις, λίστες Ο Άκης, τώρα που έμαθε και τις λίστες στην Python αποφάσισε να φτιάξει μια λίστα με ψώνια, για να μην ξεχνάει τίποτα όταν θα πηγαίνει στο σουπερ μάρκετ. Για να την κάνει και ποιο χρήσιμη, σκέφτηκε να βάζει και τις τιμές και να υπολογίζει πριν φτάσει στο ταμείο αν του φτάνουν τα χρήματα! Όμως δεν γνωρίζει εκ των προτέρων τις τιμές. Αποφάσισε να γράψει μόνο τα ψώνια και να περάσει επί τόπου τις τιμές στο Σ/Μ. Πως θα αποθηκεύσει τη λίστα με τα ψώνια του και θα την ανακτήσει στο Σ/Μ; και πως θα προσθέσει στη λίστα του επιπλέον προϊόντα; Όταν ένα πρόγραμμα χρειάζεται να αποθηκεύσει κάποια δεδομένα για μετέπειτα χρήση, τα γράφει σε ένα αρχείο με χρήση της open(), της write() και της close(). 1. Ξεκινήστε ένα νέο πρόγραμμα με όνομα: shoping_a.py. με κάποιο αρχικό μήνυμα π.χ. print ("προγραμμάτισε τα ψώνια σου") Η συνάρτηση open δημιουργεί ένα αντικείμενο αρχείου και το συσχετίζει με ένα αρχείο στο δίσκο. Η γενική μορφή χρήσης της είναι: μεταβλητή_αρχείου=open(όνομα_αρχείου, w ) μεταβλητή_αρχείου=open(όνομα_αρχείου, a ) μεταβλητή_αρχείου=open(όνομα_αρχείου, r ) το w από το write το a από το append το r από το read 2. Προσθέστε μια εντολή open που θα δημιουργεί ένα αντικείμενο αρχείου με όνομα π.χ. shopfile, θα το συσχετίζει με ένα αρχείο π.χ. market.txt και θα το ανοίγει για εγγραφή (w) # άνοιγμα/ δημιουργία αρχείου για τα ψώνια shopfile=open('market.txt', 'w') Αποθηκεύστε και τρέξτε το πρόγραμμά σας. Αναζήτησε στο φάκελο που αποθηκεύετε το αρχείο *.py, το αρχείο κειμένου market.txt που δημιουργείται κάθε φορά που εκτελείτε το πρόγραμμα, ανοίξτε το και ελέγξτε το περιεχόμενό του. 3. Προσθέστε μια εντολή με την οποία θα καταχωρείτε από το πληκτρολόγιο ένα προϊόν σε μια μεταβλητή product και στη συνέχεια την εντολή write η οποία γράφει στο αρχείο (shopfile) μια συμβολοσειρά (product) product =input ("γράψε προϊόν ") # εγγραφή στο αρχείο της συμβολοσειράς shopfile.write(product) Η μέθοδος write χρησιμοποιείται για την εγγραφή δεδομένων στο αρχείο. Η γενική μορφή χρήσης της είναι: μεταβλητή_αρχείου=write(string)
Αποθηκεύστε και τρέξτε το πρόγραμμά σας. Αναζήτησε πάλι το αρχείο κειμένου market.txt, ανοίξτε το και ελέγξτε το περιεχόμενό του. Άλλαξε κάτι;. 4. Προσθέστε μια εντολή close με την οποία θα κλείνει το αρχείο στο δίσκο #κλείσιμο του αρχείου shopfile.close() Η μέθοδος close χρησιμοποιείται για να κλείσουμε το αρχείο. Η γενική μορφή χρήσης της είναι: μεταβλητή_αρχείου.close Αποθηκεύστε, τρέξτε και ξαναελέγξτε το market.txt. Τι περιέχει τώρα; Τρέξτε μερικές φορές ακόμη το πρόγραμμά σας και ελέγξτε το αρχείο που δημιουργεί.. 5. Άλλαξε την παράμετρο προσπέλασης του αρχείου 'market.txt' από 'w' σε a και παρατήρησε τη διαφορά στο αρχείο κειμένου market.txt.. 6. Σε ποιο συμπέρασμα καταλήγετε για τον τρόπο δημιουργίας αρχείων δεδομένων με την Python;........ 7. Είστε έτοιμοι να γράψετε όλα τα ψώνια που προγραμματίζετε να κάνετε. Φτιάξτε μια επαναληπτική διαδικασία για αυτό, η οποία να τερματίζει αν δοθεί το ο. Τρέξτε το πρόγραμμά σας. Δουλεύει σωστά;.. 8. Την εντολή κλεισίματος του αρχείου την έχετε βάλει μέσα ή εκτός της επανάληψης;. Γιατί;. 9. Άλλαξε την «μέθοδο» που γίνεται εγγραφή στο αρχείο με την shopfile.write(product +'\n') και παρατήρησε τη διαφορά στο αρχείο κειμένου market.txt Σε ποιο συμπέρασμα καταλήγεις για τη χρήση του χαρακτήρα διαφυγής '\n' 10. Προσθέστε επιπλέον προϊόντα στο αρχείο σας χωρίς να σβηστούν τα προηγούμενα με χρήση της παραμέτρου a
shopfile=open('market.txt', 'a') 11. Τώρα θα φτιάξουμε ένα άλλο πρόγραμμα shoping_b.py που θα διαβάζει το αρχείο που δημιούργησε το προηγούμενο πρόγραμμα και θα το τοποθετεί σε μια λίστα. Ξεκινάμε με ένα μήνυμα και μια κενή λίστα μέσα στην οποία θα τοποθετήσουμε τα περιεχόμενα του αρχείου κειμένου market.txt: print ("τι έχω να πάρω από το σούπερ μάρκετ ") marketlist=[] 12. Στη συνέχεια γράφουμε μια εντολή, η οποία ανοίγει (open) το αρχείο 'market.txt' για ανάγνωση ( 'r') δημιουργεί ένα αντικείμενο αρχείου και εκχωρεί το αντικείμενο αυτό σε μία μεταβλητή με όνομα π.χ. : shopfile. # άνοιγμα αρχείου για ανάγνωση shopfile=open('market.txt', 'r') # διάβασμα ολόκληρου αρχείου line=shopfile.read() print (line) Εκτέλεσε το πρόγραμμα. Μας βολεύει αυτός ο τρόπος ανάγνωσης για την χρήση που θα κάνουμε στη συνέχεια; 13. Ας διαβάσουμε το αρχείο με τη μέθοδο readline(). # διάβασμα αρχείου ανά γραμμή Ποια διαφορά βλέπεις;. Εκτέλεσε μερικές φορές το παραπάνω πρόγραμμα, προσθέτοντας κάθε φορά τις δύο τελευταίες εντολές ανάγνωσης και εκτύπωσης γραμμής. print (line) print (line) Αν ένα αρχείο έχει ανοιχτεί για ανάγνωση, ('r') μπορούμε με τη μέθοδο read() του αντικειμένου αρχείου να διαβάσουμε όλο το αρχείο ή με τη μέθοδο readline() να διαβάσουμε μια γραμμή από ένα αρχείο. Μια γραμμή είναι μια συμβολοσειρά χαρακτήρων που τερματίζεται με \n. Η μέθοδος readline() επιστρέφει τη γραμμή ως συμβολοσειρά, περιλαμβανομένου και του \n.
Τι παρατηρείς;... Τι πιστεύεις ότι συμβαίνει κατά την ανάγνωση ανά γραμμή;. όταν ένα αρχείο ανοίγεται για ανάγνωση, μια ειδική τιμή με ονομασία «θέση ανάγνωσης» σηματοδοτεί τη θέση του επόμενου στοιχείου που πρόκειται να διαβαστεί από το αρχείο. 14. Και στους δύο τρόπους ανάγνωσης υπάρχει στο τέλος ο χαρακτήρας '\n'. Για την αφαίρεση του θα χρησιμοποιήσουμε τη μέθοδο συμβολοσειράς rstrip() η οποία αφαιρεί χαρακτήρες από το δεξί (right) άκρο μιας συμβολοσειράς. # αφαίρεση από τη γραμμή του χαρακτήρα \n line=line.rstrip('\n') 15. Θέλουμε να διαβάζουμε όλο το αρχείο μέχρι να συναντήσουμε κενή γραμμή και να προσθέτουμε (append) την κάθε γραμμή στη λίστα marketlist. Προσθέστε το κατάλληλο σημείο τις εντολές; while line!= "": marketlist.append (line) 16. Αν τυπώσουμε απλά τη λίστα δεν θα έχουμε τη δυνατότητα να εισάγουμε τιμές σε κάθε γραμμή. Για να το πετύχουμε αυτό θα διατρέξουμε ένα- ένα στοιχείο της λίστας με τη for για όλο το μήκος (len) της λίστας print (i+1, ". ", marketlist[i], "", end =" ") 17. και θα εισάγουμε τιμή για κάθε προϊόν με input() for i in range(0, len (marketlist)): print (i+1, ". ", marketlist[i], "", end =" ") timi=int(input (" = ")) 18. να αποθηκεύαμε και τις τιμές που δίνουμε σε μια λίστα; Τι εντολές θα πρέπει να προσθέσουμε; 19. Να τις αθροίζαμε συγχρόνως για να έχουμε και το συνολικό κόστος; Τι εντολές θα πρέπει να προσθέσουμε;
. 20. Τέλος να δίνει τα χρήματα που διαθέτει και αν δεν επαρκούν το πρόγραμμα να του προτείνει να αφαιρέσει κάποιο προϊόν από τη λίστα του δηλώνοντας τον αύξοντα αριθμό του, αλλιώς να του υπολογίζει τα ρέστα. if cost>poso: print ("δεν μπορώ να τα αγοράσω όλα") print ("δείξε μου να σκεφτώ τι θα αφήσω") 21. Βελτιώστε την εμφάνιση των αποτελεσμάτων σας όπως θέλετε. Ενδεικτικές λύσεις για τα δύο προγράμματα: print ("προγραμμάτισε τα ψώνια σου") # άνοιγμα/ δημιουργία αρχείου για τα ψώνια shopfile=open('market.txt', 'w') c=true while c: product=input ("γράψε προϊόν ή πάτα ο για τέλος ") if product== "o" or product== "ο": c=false else: shopfile.write(product +'\n') #κλείσιμο του αρχείου shopfile.close() print ("προγραμμάτισε τις αγορές σου") #λίστες για τα ψώνια και τις τιμές τους marketlist=[] exoda=[] # χρήματα που διαθέτεις #poso=100 c=true cost=0 # άνοιγμα αρχείου για ανάγνωση shopfile=open('market.txt', 'r') #διάβασμα 1ης γραμμής # αφαίρεση από τη γραμμμή του χαρακτήρα \n line=line.rstrip('\n') #διάβασμα όλου του αρχείου ανά γραμμή και προσθήκη του στη λίστα αγορών while line!="": marketlist.append (line) line=line.rstrip('\n')
print ("εμφάνιση λίστας για ψώνια") print (i+1, ". ", marketlist[i], "", end =" ") timi=int(input ("= ")) exoda.append (timi) cost=cost+timi print ("το συνολικό ποσό είναι: ", cost) poso=int(input ("δώσε χρήματα που διαθέτεις: ")) if cost>poso: print ("δεν μπορώ να τα αγοράσω όλα") print ("δείξε μου να σκεφτώ τι θα αφήσω") # εμφάνιση και των δύο λιστών παράλληλα print (i+1, marketlist[i], "=",exoda [i]) # αφαίρεση προϊόντος και από τις δύο λίστες af=int(input(' ποιο νούμερο αφαιρείς;')) marketlist.remove(marketlist[af-1]) exoda.remove(exoda[af-1]) # εκτύπωση νέων λίστών παράλληλα print (i+1, marketlist[i], "=",exoda [i]) else: print ("τα ρέστα σου είναι :", poso-cost, "ευρώ")