Mist, jetzt habe ich auch noch Streamlit gefunden. Jetzt geht mir langsam die Zeit aus...
Example Class
-
Ich habe ja hier im Beitrag schon mal versucht zu erklären, wie man Daten in Python lädt und speichert. Als Beispiel dient mir meine BackupList. So lege ich das in meinen beiden Python Projekten meines Restic UI ab.
Anhand dieses Beispieles habe ich mal eine Klasse gebaut, die das alles enthält. So in etwa ist das auch in meinen Projekten drin, da ich aber Zweifel habe das ich dort alles richtig gemacht habe, hier diese Basisarbeit. Soll auch mir die Grundlagen näher bringen.
Für Profis, die hier mitlesen, ich freue mich über Verbesserungen und ich mache bestimmt auch einiges falsch. Also ran, einfach hier drunter kommentieren.
Example Class
Die Klasse beinhaltet die folgenden Funktionen.
-
Add
-
Update
-
Delete
-
Save JSON
-
Load JSON
-
Keys & Last Key
import json class BackupList(): """ Class for managing my backup data. Here only as a sample. Functions Add, Update, Delete, Save JSON, Load JSON and Keys, Last Key implemented. """ def __init__(self, name, repository): # instantiate an empty dict self.name = name self.repository = repository @staticmethod def add(name, repository): # Add an object print("ADD", name, repository) backups[(BackupList.last_key()) + 1] = BackupList(name, repository) @staticmethod def update(counter, name, repository): # Update an object try: backups[counter].name = name backups[counter].repository = repository backups.update() except IOError: print("Error") @staticmethod def delete(number): # Delete an object backups.pop(number) @staticmethod def keys(): # Create keys list keys_list = [] # redo keys_list for key in backups: keys_list.append(key) print("Keys:", keys_list) @staticmethod def save_json(): # Save my class as JSON backups_json = {} for count, value in enumerate(backups): print("Save", backups[value].name) backups_json[value] = {'name': backups[value].name, 'repository': backups[value].repository} # save backups to JSON with open('mydata.json', 'w') as f: json.dump(backups_json, f) @staticmethod def load_json(): # load JSON with (open('mydata.json', 'r')) as f: backups_reload = json.load(f) # Create objects for my class for count, value in enumerate(backups_reload.values()): print("Reload", value['name'], "Counter:", count) backups[count] = BackupList(value['name'], value['repository']) @staticmethod def last_key(): # Create last key last_key = list(dict.keys(backups))[-1] return last_key # create an empty dict backups = {} # Load data from filesystem BackupList.load_json() def main(): # Add an entry #BackupList.add('Test02', '/home/frankm/repo2') #BackupList.add('Test03', '/home/frankm/repo3') #BackupList.add('Test04', '/home/frankm/repo4') # Print some data #print(backups[0].name) #print(backups[1].name) # Del an entry #BackupList.delete(1) print ('-------------') # Print keys BackupList.keys() print ('-------------') # Save data as JSON file BackupList.save_json() print ('-------------') # Uncomment to update entry backups[4] #BackupList.update(4, "TESTING6", "REPO") # After update we must save the data #BackupList.save_json() print ('-------------') # Print data from backups for count, value in enumerate(backups): print("Control", count, backups[value].name) if __name__ == "__main__": main()
Ich hoffe es hilft dem ein oder anderen Einsteiger in das Thema JSON und Daten dauerhaft speichern.
Den Beispielcode findet ihr -> https://gitlab.com/-/snippets/2438459
-
-
-
Aufgrund diverser Code Stellen in meinen beiden Projekten, die etwas wirr aussahen, habe ich ja obige Grundlagenarbeit gemacht gehabt.
Am Wochenende habe ich dann das Erlernte in die Tat umgesetzt und mein PyWebIO Projekt vollständig umgebaut. Dabei konnte ich viel Code eliminieren und es wesentlich übersichtlicher gestalten.
Dabei lernt man dann auch immer wieder eine Menge dazu und so entstand meine erste Funktion mit **kwargs
@staticmethod def update(counter, **kwargs):
Wer was im Code wühlen möchte, findet das Repo zu meinem Restic UI auf Basis von PyWebIO hier.
Da die Funktionen jetzt alle drin sind und hoffentlich auch alle funktionieren, mach ich mal die Tage wieder ein Video. Dabei finde ich immer die meisten Fehler
-
-
In meinem PywebIO Projekt tauchte heute ein alter Bekannter auf. Wenn ich einen Eintrag (innerhalb der Liste) löschte, war das etwas durcheinander
Ja, den Fehler kenne ich schon was länger und stolper immer mal wieder drüber. Heute z.B.
Also mal grübeln
Das mache ich, wenn ich einen Eintrag lösche
case 'Yes': # delete entrie BackupList.delete((line - 1)) # save json BackupList.save_json() # Load data from filesystem BackupList.load_json() # Reload Tab Backup backup()
Ich mache folgendes
- lösche den Eintrag
- speicher die Liste
- lade die Liste
- baue den Tab wieder auf
Das führt aber dazu, das meine Liste die als Objekt im Speicher steht nicht aktuell ist. Im Gegenteil, da ist dann etwas Unordnung. Ich brauchte also die Möglichkeit mein Objekt backups irgendwie zurückzusetzen.
Mal gegoogelt und die Dinge sind manchmal wirklich total easy
# clear dict backups.clear()
Das leert das Objekt und im nächsten Schritt kann ich es wieder befüllen.
Lösung
case 'Yes': # delete entrie BackupList.delete((line - 1)) # save json BackupList.save_json() # clear dict backups.clear() # Load data from filesystem BackupList.load_json() # Reload Tab Backup backup()
Problem erledigt. Damit ich das noch finde, wenn mein Kopf das nicht mehr hergibt, notiere ich das hier.