Προσπαθώ να φτιάξω μία κλάση η οποία να κάνει αποθήκευση και ανάκτηση μεταβλητών σε ένα αρχείο
(περίπου όπως και το module pickle της python).
Μέχρι τώρα έχω καταφέρει να αποθηκεύει και να φορτώνει όλου του είδους της μεταβλητές εκτός από
αντικείμενα(objects) και λίστες.
Λίγα λόγια για να καταλάβετε πως δουλεύει:
Δημιουργώ ένα object δίνοντας στην κλάση μία παράμετρο(το αρχείο).
Στην συνέχει καλώ την μέθοδο save δίνοντας ως παράμετρο μια λίστα
η οποία περιέχει της μεταβλητές τις οποίες θέλω να αποθηκεύσω.
Αυτό που κάνει η 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χει κανείς καμιά ιδέα;