Fix some bugs See merge request Bullet64/restic_ui_pywebio!71
faviconGitLab (gitlab.com)
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.
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
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.
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.