Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: Μπορείτε να προτείνετε ιδέες για την λύσει ενός προβλήματος;

Μπορείτε να προτείνετε ιδέες για την λύσει ενός προβλήματος; 9 Χρόνια 2 Μήνες πριν #2714

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Προσπαθώ να φτιάξω μία κλάση η οποία να κάνει αποθήκευση και ανάκτηση μεταβλητών σε ένα αρχείο
(περίπου όπως και το module pickle της python).

Μέχρι τώρα έχω καταφέρει να αποθηκεύει και να φορτώνει όλου του είδους της μεταβλητές εκτός από
αντικείμενα(objects) και λίστες.

Λίγα λόγια για να καταλάβετε πως δουλεύει:

Δημιουργώ ένα object δίνοντας στην κλάση μία παράμετρο(το αρχείο).
object = file.file(File)

Στην συνέχει καλώ την μέθοδο save δίνοντας ως παράμετρο μια λίστα
η οποία περιέχει της μεταβλητές τις οποίες θέλω να αποθηκεύσω.
object.save(savelist)

Αυτό που κάνει η save είναι να αποθηκεύει σε κάθε γραμμή ξεχωριστά
τα διάφορα στοιχεία τις savelist ως χαρακτήρες. Επίσης προσθέτει
και σε κάθε γραμμή και τον τύπο της μεταβλητής.Δηλαδή για να καταλάβετε
καλύτερα το αρχείο θα μοιάζει έτσι:
<SaveFile>
True/bool
1.12/float
123/int
Petros/string
<SaveFile/>

Τα <SaveFile> και <SaveFile/> είναι flags για να γνωρίζω ότι αυτό το αρχείο είναι
αρχείο τύπου savefile έτσι ώστε η μέθοδος load να μπορεί να το τσεκάρει.
Το / είναι για να χωρίζω την μεταβλητή από τον τύπο.

Τέλος καλώντας την load μπορώ να φορτώσω το τις μεταβλητές από το αρχείο.Αυτό που κάνει είναι
να ξεχωρίζει το κάθε string που διαβάζει και να το μετατρέπει στον αντίστοιχο
τύπο.

Άμα δεν βαριέστε ρίξτε και μια ματιά στο source code.Πιστεύω πως με την εξήγηση που σας
έδωσα, μπορείτε τώρα να τον καταλάβετε αρκετά ποιο γρήγορα.
#-*- coding: utf-8 -*-
 
class file:
 
    #Ανάθεση τιμής στην self.file#
    def __init__(self, file):
        self.file = file
        pass
    #Ανάθεση τιμής στην self.file#
 
 
 
    #Αυτήν η μέθοδος αποθηκεύει μια λίστα (η οποία περιέχει μεταβλητές) στο αρχείο self.file#
    def save(self, savelist):
 
        #Είναι το αρχείο σε write mode?
        if (self.file.mode == "w"):
 
            #Δημιουργία του flag <SaveFile>.
            self.file.write("<SaveFile>\n")
 
 
            for i in range(len(savelist)):
 
                #Αποθήκευση ακέραιας μεταβλητής.
                if (type(savelist[i]) is int):
 
                    self.file.write(str(savelist[i])+"/int\n")
                    pass
 
                #Αποθήκευση πραγματικής μεταβλητής.
                elif (type(savelist[i]) is float):
 
                    self.file.write(str(savelist[i])+"/float\n")
                    pass
 
                #Αποθήκευση λογικής μεταβλητής.
                elif (type(savelist[i]) is bool):
 
                    self.file.write(str(savelist[i])+"/bool\n")
                    pass
 
                #Αποθήκευση μεταβλητής χαρακτήρων.
                else:
                    self.file.write(str(savelist[i])+"/string\n")
                    pass
                pass
 
            #Δημιουργία του flag <SaveFile/>  
            self.file.write("<SaveFile/>")
 
 
        #Δεν είναι.
        else:
            print("The file must be in write mode.")
            return
        pass
    #Αυτήν η μέθοδος αποθηκεύει μια λίστα (η οποία περιέχει μεταβλητές) στο αρχείο self.file#
 
 
 
 
    #Αυτήν η μέθοδος φορτώνει τις μεταβλητές που έχουν αποθηκευτεί στο αρχείο self.file#
    def load(self):
 
        #Είναι το αρχείο σε read mode?
        if (self.file.mode == "r"):
 
            #____________Μεταβλητές____________#
            loadlist = []
            string   = self.file.readline()#Διάβασμα της πρώτης γραμμής.
            new_str  = ""
            #____________Μεταβλητές____________#
 
            #Τσεκάρω να δω αν το αρχείο είναι <SaveFile>.
            if (string != "<SaveFile>\n"):
                print("The file isn't a SaveFile.")
                return
 
            while (True):
 
                #Διάβασμα της επόμενης γραμμής.
                string   = self.file.readline()
 
                #Τέλος αρχείου.
                if ("<SaveFile/>" in string):
                    return loadlist
 
                #Δημιουργία μιας λίστας.
                List = list(string)
 
 
                #Δημιουργώ την μεταβλητή σε χαρακτήρες.#
                for i in range(len(List)):
 
                    #Έτοιμη!!!.
                    if (List[i] == "/"):
                        break
 
                    #Πρόσθεση του επόμενου χαρακτήρα.
                    else:
                        new_str += List[i]
                        continue
                    pass
                #Δημιουργώ την μεταβλητή σε χαρακτήρες.#
 
 
                #Είναι ακέραια μεταβλητή?
                if ("int" in string):
                    loadlist.append(int(new_str))
                    new_str  = ""
                    pass
 
                #Είναι πραγματική μεταβλητή?
                elif ("float" in string):
                    loadlist.append(float(new_str))
                    new_str  = ""
                    pass
 
                #Είναι λογική μεταβλητή?
                elif ("bool" in string):
                    loadlist.append(bool(new_str))
                    new_str  = ""
                    pass
 
                #Είναι μεταβλητή χαρακτήρων?
                else:
                    loadlist.append(new_str)
                    new_str  = ""
                    pass
                pass
 
            pass
 
        #Δεν είναι.
        else:
            print("The file must be in read mode.")
            return
        pass
    #Αυτήν η μέθοδος φορτώνει τις μεταβλητές που έχουν αποθηκευτεί στο αρχείο self.file#
 
 



To πρόβλημα στο οποίο θέλω να με βοηθήσετε είναι το εξής.Τη γίνεται αν στην savelist
υπάρχει σε κάποιο στοιχείο της μια άλλη λίστα;Και άμα επιπλέον μέσα σε αυτήν την
λίστα υπάρχει ακόμα μία και πάει λέγοντας τη γίνετε;;Eχει κανείς καμιά ιδέα;
Τελευταία διόρθωση: 9 Χρόνια 2 Μήνες πριν από babaliaris1.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Μπορείτε να προτείνετε ιδέες για την λύσει ενός προβλήματος; 9 Χρόνια 2 Μήνες πριν #2718

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
Τι ακριβώς θέλεις να πετύχεις; Ποιο είναι το πρόβλημα που θες να λύσεις;

Ή μήπως είναι καθαρά για λόγους εκμάθησης αυτό που κάνεις;
Τελευταία διόρθωση: 9 Χρόνια 2 Μήνες πριν από pmav99.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Μπορείτε να προτείνετε ιδέες για την λύσει ενός προβλήματος; 9 Χρόνια 2 Μήνες πριν #2721

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
pmav99 έγραψε:
Τι ακριβώς θέλεις να πετύχεις; Ποιο είναι το πρόβλημα που θες να λύσεις;

Ή μήπως είναι καθαρά για λόγους εκμάθησης αυτό που κάνεις;


Είναι απλός ένα challenge που έβαλα στον εαυτό μου, και είναι για λόγους εκμάθησης(κυρίως για
να ανεβάσω την εμπειρία μου).Όπως είπα το πρόβλημα είναι η εγγραφεί και ανάγνωση μεταβλητών.
(για παράδειγμα άμα έχεις ένα πρόγραμμά το οποίο είναι μια λίστα με ψώνια και θέλεις όταν
κλείνει το πρόγραμμα να μην χάνονται τα δεδομένα του αλλά να αποθηκεύονται στον σκληρό) .
Το πρόβλημα σχεδόν το έλυσα απλός κόλλησα στην περίπτωση που στην savelist υπάρχει ακόμα μία
λίστα μέσα.Γνωρίζω βέβαια για το pickle και το έχω χρησιμοποιήσει πολλές φορές, αλλά όπως
είπα αυτό το κάνω για λόγους εκμάθησης.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Μπορείτε να προτείνετε ιδέες για την λύσει ενός προβλήματος; 9 Χρόνια 2 Μήνες πριν #2722

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
Το format που περιγράφεις ως έχει δεν μπορεί να σώσει nested δομές. Θα πρέπει να το αλλάξεις. Πχ να επιτρέπεις να έχεις <SaveFile>...<SaveFile/> στο εσωτερικό ενός άλλου <SaveFile>...<SaveFile/>. Μετά θα μπορείς να καλείς αναδρομικά τη συνάρτηση που κάνει το serialization.

Το πρόβλημα που πας να λύσεις πάντως είναι τετριμμένο. Αυτό που έχεις φτιάξει πχ είναι ένα πολύ απλοποιημένο XML.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": babaliaris1

Μπορείτε να προτείνετε ιδέες για την λύσει ενός προβλήματος; 9 Χρόνια 2 Μήνες πριν #2725

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
pmav99 έγραψε:
Το format που περιγράφεις ως έχει δεν μπορεί να σώσει nested δομές. Θα πρέπει να το αλλάξεις. Πχ να επιτρέπεις να έχεις <SaveFile>...<SaveFile/> στο εσωτερικό ενός άλλου <SaveFile>...<SaveFile/>. Μετά θα μπορείς να καλείς αναδρομικά τη συνάρτηση που κάνει το serialization.

Α κατάλαβα τη εννοείς :lol:
Λογικά αυτό το λύνει το πρόβλημα.
Θα το δοκιμάσω να δω αν τα καταφέρω. :P
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Μπορείτε να προτείνετε ιδέες για την λύσει ενός προβλήματος; 9 Χρόνια 2 Μήνες πριν #2727

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Το έκανα!!!!!!
for i in range(len(savelist)):
 
                #Αποθήκευση ακαίρεας μεταβλητής.
                if (type(savelist[i]) is int):
 
                    self.file.write(str(savelist[i])+"/int\n")
                    pass
 
                #Αποθήκευση πραγρματικής μεταβλητής.
                elif (type(savelist[i]) is float):
 
                    self.file.write(str(savelist[i])+"/float\n")
                    pass
 
                #Αποθήκευση λογικής μεταβλητής.
                elif (type(savelist[i]) is bool):
 
                    self.file.write(str(savelist[i])+"/bool\n")
                    pass
 
 
                #Πρόσθεσα αυτόν τον κώδικα και λειτουργεί#
                elif (type(savelist[i]) is list):
                    ob = file(self.file)
                    ob.save(savelist[i])
                    pass
 
                #Αποθήκευση μεταβλητής χαρακτήρων.
                else:
                    self.file.write(str(savelist[i])+"/string\n")
                    pass
                pass
 
            #Δημιουργία του flag <SaveFile/>  
            self.file.write("<SaveFile/>\n")

Δημιουργεί μια χαρά nested <SaveFile>.
Πω μιλάμε ευχαριστώ πολύ.
Φαίνεται δεν το σκέφτηκα γιατί μέχρι τώρα δεν είχα χρησιμοποιήσει
ποτέ μου σε κώδικα αναδρομική συνάρτηση επειδή δεν την χρειάστηκα ποτέ.
Άντε έμαθα και κάτι καινούριο λύνοντας αυτό το πρόβλημα.

Πάντως σε ευχαριστώ πάρα πολύ.
Την αγαπάω αυτήν την κοινότητα.!!!
Άμα δεν υπήρχε δεν θα είχα τις γνώσεις που έχω τώρα!!! :)
Τελευταία διόρθωση: 9 Χρόνια 2 Μήνες πριν από babaliaris1.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.464 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου