nickT Δημοσ. 24 Ιουλίου 2011 Δημοσ. 24 Ιουλίου 2011 Καλησπέρα. Καταρχήν να σας ενημερώσω πως είμαι λίγο αρχάριος και ασχολούμαι με το προγραμματισμό για χόμπι. Έχω φτιάξει ένα πρόγραμμα που αποθηκεύει συνταγές μαγειρικής σε αρχεία ".txt". Ας μπούμε στο θέμα μα μας τώρα. Στις τελευταίες 3 γραμμές,κάθε αρχείου,αποθηκεύω μερικές πληροφορίες (tags),από κάποιες list,για να μπορώ να κάνω αναζήτηση αργότερα,βάση των tags. π.χ.αποθηκεύονται έτσι: >Συνταγή -------- μπλα μπλα -------------- ['Χοιρινό'] ['Δεύτερο'] ['Πατάτες'] Σε μια γραμμή,μπορούν να αποθηκευτούν περισσότερα από ένα tags. Ξέρω πως να ανοίξω το αρχείο text.Ξέρω πως να το διαβάσω.Το ζητούμενο είναι άλλο. Πείτε πως ο χρήστης ψάχνει να βρει τα εξής tags,που αποθηκεύονται στις ανάλογες λίστες. π.χ. >kreas=['Χοιρινό'] piato=['Δεύτερο','Άλλο'] garnitoura=['Πατάτες','Ρύζι','Άλλο'] Το πρόγραμμα ανοίγει όλα τα αρχεία,και ψάχνει στο καθένα τις τελευταίες 3 γραμμές. Συγκρίνει την γραμμή του κειμένου keimeno[-3] με το kreas.Την keimeno[-2] με το piato,και το keimeno[-1] με το garnitoura. Προσπάθησα με το: >if kreas in keimeno[-3] and piato in keimeno[-2] and garnitoura in keimeno[-1] αλλά δεν μπορείς να συγκρίνεις λίστες με κείμενα. Αν είχα όριο στις επιλογές που θα έβαζε ο χρήστης για ψάξιμο,δεν θα είχα πρόβλημα. π.χ αν έβαζα μια επιλογή από κάθε κατηγορία θα το έκανα έτσι: code]if kreas[0] in keimeno[-3] and piato[0] in keimeno[-2] and garnitoura[0] in keimeno[-1][/code] Αλλά τώρα δεν ξέρω πόσες θα βάλει. Έχω σπάσει το κεφάλι μου και δεν μπορώ να βρω έναν αποδοτικό τρόπο. Εσείς,τί μου προτείνετε; Ευχαριστώ και όσους ασχοληθήκατε,και ας μην ξέρετε την απάντηση!!!
migf1 Δημοσ. 24 Ιουλίου 2011 Δημοσ. 24 Ιουλίου 2011 Δεν ξέρω να σου απαντήσω, μιας και δεν γνωρίζω python αλλά έχω θέλω να σε ρωτήσω αν έχεις κάποιον ιδιαίτερο λόγο που τα tags τα βάζεις στο τέλος και όχι στην αρχή των αρχείων. Θα είναι πολύ ταχύτερο το πρόγραμμά σου αν τα βάζεις στην αρχή τα tags (υποθέτω πως τα μεγέθη των αρχείων σου δεν είναι fixed, έτσι δεν είναι; )
nickT Δημοσ. 24 Ιουλίου 2011 Μέλος Δημοσ. 24 Ιουλίου 2011 Ναι δεν είναι fixed τα μεγέθη.Απλός για να είναι καλύτερο στο μάτι. Ευχαριστώ που μου το είπες πάντως!!!,γιατί δεν ήξερα πως επηρεάζει την ταχύτητα του προγράμματος!!!
migf1 Δημοσ. 25 Ιουλίου 2011 Δημοσ. 25 Ιουλίου 2011 Ναι, την επηρεάζει θετικά γιατί δεν θα χρειάζεται να διαβάζει όλα τα αρχεία μέχρι το τέλος τους, θα διαβάζει τις 3 πρώτες γραμμές μόνο σε κάθε αναζήτηση του χρήστη
nickT Δημοσ. 25 Ιουλίου 2011 Μέλος Δημοσ. 25 Ιουλίου 2011 Μετά από πολλές ώρες εχτές το απόγευμα. Μετά από πολλά όνειρα,με χιλιάδες γραμμές κώδικα,εχτές το βράδυ. Και,μετά από σκέψη σήμερα το απόγευμα,ΤΗΝ ΒΡΗΚΑ ΤΗ ΛΥΣΗ!!!! Την βάζω γιατί μπορεί κάποιος να έχει την ίδια απορία με μένα!!! >def check_k(lista,keimeno): i=0 if i< len(lista): if lista[i] in keimeno: i+=1 if i<len(lista): if lista[i] in keimeno: i+=1 if i<len(lista): if lista[i] in keimeno: return True else: return False else: return True else: return False else: return True else: return False else: return True die =dir_sin+arxeio ->Διεύθυνση αρχείου (Σαν dir_sin,έχω ορίσει πιο πριν το φάκελο του αρχείου,και σαν arxeio,την ονομασία του) f=open(die,"r",encoding="utf8") keimeno=f.read() f.close() a=keimeno.split("\n") gar=check_k(garnitoura,a[-1]) pia=check_k(piato,a[-2]) kre=check_k(kreas,a[-3]) if gar==True and pia==True and kre==True: ΜΠΛΑ ΜΠΛΑ ΜΠΛΑ!!! Άσχετη ερώτηση: Έβγαλαν το spoil? Γιατί ήθελα να βάλω τον κώδικα σε spoil,για να μην είναι τεράστιο,και κουραστικό το κείμενο,αλλά δεν το βρίσκω!!!
b_real Δημοσ. 25 Ιουλίου 2011 Δημοσ. 25 Ιουλίου 2011 Επειδη δεν ξερω αν το επιασα καλα.... Στην ουσια σου δινουν μια λιστα κ θελεις να ψαξεις αν καποιο απο τα στοιχεια της υπαρχει μεσα σε μια αλλη λιστα (γτ εσυ μετατρεπεις το κειμενο σε λιστα με το split) Σωστα;;; Αρχικα μπορεις να παρεις τα 3 τελευταια στοιχεια-σειρες με >b = a[-3:] τωρα οι 3 τελευταιες σειρες ειναι σε μια λιστα Μετα μπορεις να κανεις ενα for μεσα στα στοιχεια μια λιστας χωρις να σε νοιαζει ποσα ειναι αυτα και να μην κανεις ολα αυτα τα if. Δηλαδη: >for i in kreas: #σε καθε for το i παιρνει την τιμη ενος στοιχειου της λιστας if i in b: #και εδω κανεις οτι θες
nickT Δημοσ. 26 Ιουλίου 2011 Μέλος Δημοσ. 26 Ιουλίου 2011 Ήθελα τη λίστα kreas να την ψάξω συγκεκριμένα στη σειρά a[-3] τη λίστα piato στη σειρά a[-2] και την λίστα garnitoura στη σειρά a[-1] Αλλά και αυτό που λες,για το b=a[-3:],έχει λογική,και τώρα που το σκέφτομαι άνετα μπορούσα να το κάνω έτσι!!! Όσο για το τύπο που μου έδωσες.Δοκίμασα να βρω κάποια λύση με το for και το while,αλλά ότι και να έκανα δεν μου έβγαινε.Το μόνο που δούλεψε ήταν αυτό,και μου φαίνεται πιο λογικό. Με τον τύπο που μου έδωσες λες στο μηχάνημα,αν βρεις το kreas[0] μέσα στο κείμενο,κάνε αυτό.Μετά αν βρεις το kreas[1] στο κείμενο,κάνε αυτό(και συνεχίζεται για όλες τις τιμές...) Εγώ του λέω.Ψάξε το kreas[0],και αν είναι σωστό,τότε ψάξε το kreas[1],αλλιώς δώσε False.Άμα τα βρει όλα true,τότε οκ.Πάμε παρακάτω... Με το for,και false να είναι,θα συνεχίσει να ψάχνει μέχρι και την τελευταία τιμή.Και αν η τελευταία τιμή είναι true(δηλαδή υπάρχει),από εκεί που έπρεπε να βγάλει τη λέξη,θα μου την συμπεριλάβει στο αποτέλεσμα της αναζήτησης!!! Ελπίζω να σε έκανα να το καταλάβεις έστω και λίγο,γιατί από θεωρία δεν τα πάω και τόσο καλά...
b_real Δημοσ. 27 Ιουλίου 2011 Δημοσ. 27 Ιουλίου 2011 Σε χανω σε καποια σημεια. Αρχικα τα tags στο τελος καθε αρχειου θα περιεχουν ενα στοιχειο η και περισσοτερα; καπως ετσι δλδ >['Χοιρινό'] ['Δεύτερο'] ['Πατάτες,ρυζι'] Απο αυτα που λες υποθέτω το δευτερο... Kαι θες ολα τα στοιχεια της μιας λιστας να υπαρχουν στην δευτερη και μονο τοτε να σου επιστρεφεται κατι αλλιως να παιρνεις ενα false;;;
nickT Δημοσ. 27 Ιουλίου 2011 Μέλος Δημοσ. 27 Ιουλίου 2011 Όταν αποθηκεύω ένα κείμενο,αποθηκεύω στη γραμμή (a[-3]) του κειμένου τον τύπο του κρέατος,της συνταγής. Στην αναζήτηση που κάνει κάποιος για να βρει μια συνταγή δίνει τι κρέας θέλει να έχει η συνταγή,και η επιλογή του αποθηκεύεται σε μια λίστα με την ονομασία kreas. Το αντίστοιχο γίνεται και με τις γαρνιτούρες και τον τύπο του πιάτου(πρώτο,δεύτερο κ.α.). Αυτό που κάνω με το check_k,είναι να δω αν υπάρχουν ένα-ένα όλα τα στοιχεία της λίστας kreas μέσα στην γραμμή του κειμένου,a[-3].Αν ναι μου βγάζει true,αλλιώς false!!! Μετά ψάχνω να βρω αν υπάρχουν όλα τα στοιχεία της λίστας piato,μέσα στη γραμμή του κειμένου a[-2].και μετά τα στοιχεία της λίστας garnitoura στο a[-1]. Αν το check_k μου δώσει και στα 3 True,μου δείχνει το συγκεκριμένο κείμενο στα αποτελέσματα της αναζήτησής μου.
jol1naras Δημοσ. 28 Ιουλίου 2011 Δημοσ. 28 Ιουλίου 2011 Δεν καταλαβαινω και πολλά από αυτό που θες να κάνεις γιατί είναι αρκετά μπερδεμένο. Εγώ θα σου προτείνω κάτι άλλο για να διευκολυνθείς. 1. Μπορείς να χρησιμοποιήσεις βάση δεδομένων και να θα λυθούν σίγουρα τα χέρια σου. 2. Αν δεν θες βάση δεδομένων, γιατί δεν αποθηκεύεις σε ένα dictionary κάθε συνταγή, η οποία θα έχει σαν κλειδί το όνομα της (αυτο μπορείς να το κάνεις και σε ένα άλλο αρχείο βεβαια). Επίσης μπορείς να χρησιμοποιήσεις pickle ή shelve για την αποθήκευση των δεδομένων. Εγώ τουλάχιστον θα τα προτιμούσα...
nickT Δημοσ. 28 Ιουλίου 2011 Μέλος Δημοσ. 28 Ιουλίου 2011 Θα μπορούσες να μου δώσεις ένα παράδειγμα πως λειτουργεί η βάση δεδομένων? Δεν ξέρω πως να φτιάξω μια,και πάντα το είχα σαν απορία.
jol1naras Δημοσ. 29 Ιουλίου 2011 Δημοσ. 29 Ιουλίου 2011 Θα μπορούσες να μου δώσεις ένα παράδειγμα πως λειτουργεί η βάση δεδομένων? Δεν ξέρω πως να φτιάξω μια,και πάντα το είχα σαν απορία. Πρέπει να φτιάξεις μια βαση δεδομένων χρησιμοποιώντας SQL. Βασικά SQLite που είναι πιο εύκολη και με λιγότερες δυνατότητες φυσικά. Μετά θα πρέπει να συνδέσεις τον κώδικα σου με την βάση, αυτό είναι αρκετά εύκολο.
nickT Δημοσ. 29 Ιουλίου 2011 Μέλος Δημοσ. 29 Ιουλίου 2011 Ξέρεις που μπορώ να βρω πληροφορίες? Θα ψάξω αύριο το απογευματάκι,γιατί είναι αργά τώρα,αλλά άμα ξέρεις κανένα site,θα με διευκόλυνες πολύ!!! Ευχαριστώ πάντως για την πληροφορία.Θα το ψάξω!!!
jol1naras Δημοσ. 29 Ιουλίου 2011 Δημοσ. 29 Ιουλίου 2011 http://www.python.org/doc//current/library/sqlite3.html http://sqlzoo.net/ http://www.w3schools.com/sql/default.asp http://www.sqlite.org/lang.html <------ δεν είναι και ότι καλύτερο Θα σου πρότεινα να διαβάσεις κάποιο βιβλίο, είναι πιο αναλύτικά και κατανοητά, αν βέβαια βαρίεσαι να διαβάζεις θα κάνεις και τη δουλεία σου με τα site, αλλά συνήθως δεν λένε πολλά… Καλή τύχη!
jol1naras Δημοσ. 29 Ιουλίου 2011 Δημοσ. 29 Ιουλίου 2011 Η σύνδεση με τη βάση είναι πολυ εύκολη και ειδικά με την sqlite. Το πως θα φτιάξεις την βάση αν δεν ξέρεις ίσως σε ζορίσει λιγάκι.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.