Seite 1 von 1
Dictionary anpassen / bearbeiten
Verfasst: Sonntag 8. August 2021, 16:40
von Kalysto
Hallo zusammen,
Ich brauche eure Hilfe denn ich komme nicht weiter..
zu meinem Vorhaben ich habe diese dict (gekürzt):
Code: Alles auswählen
CUSTOMER_FOLDER = {'Kunden Übersicht': ['01_Beschreibung', '02_Materiallisten', '03_Prüfungen', '04_KNX', '05_Bilder', '06_Notizen', '07_Datenbank'], '01_Beschreibung': ['01_Beschreibung/Beschriftung Verteilungen.smg', '01_Beschreibung/Beschriftung Verteilungen.xlsx'], '02_Materiallisten': ['02_Materiallisten/Projekt-name'], '02_Materiallisten/Projekt-name': ['02_Materiallisten/Projekt-name/Eintragungen', '02_Materiallisten/Projekt-name/Geschlossen', '02_Materiallisten/Projekt-name/Zwischenrechnung']}
Ich möchte nun mit Auswahl eines Bestimmten "Hauptordners" unter Kunden Übersicht alle untergeordneten Key's sowie values anpassen...
Code: Alles auswählen
CUSTOMER_FOLDER['Kunden Übersicht'][1] # 02_Materiallisten
# 02_Materiallisten --> Ich_bin_der_neue_name
CUSTOMER_FOLDER = {'Kunden Übersicht': ['01_Beschreibung', 'Ich_bin_der_neue_name', '03_Prüfungen', '04_KNX', '05_Bilder', '06_Notizen', '07_Datenbank'], '01_Beschreibung': ['01_Beschreibung/Beschriftung Verteilungen.smg', '01_Beschreibung/Beschriftung Verteilungen.xlsx'], 'Ich_bin_der_neue_name': ['Ich_bin_der_neue_name/Projekt-name'], 'Ich_bin_der_neue_name/Projekt-name': ['Ich_bin_der_neue_name/Projekt-name/Eintragungen', 'Ich_bin_der_neue_name/Projekt-name/Geschlossen', 'Ich_bin_der_neue_name/Projekt-name/Zwischenrechnung']]}
alles was ich bisher versucht habe brachte nicht den erfolg welchen ich wollte.....
das einzige was ich hin bekommen hatte war in dem Key Kunden Übersicht die angaben zu ändern mit:
Code: Alles auswählen
path = '02_Materiallisten'
CUSTOMER_FOLDER__index = CUSTOMER_FOLDER[list(CUSTOMER_FOLDER)[0]].index(path)
CUSTOMER_FOLDER[list(CUSTOMER_FOLDER)[0]].remove(path)
CUSTOMER_FOLDER[list(CUSTOMER_FOLDER)[0]].insert(CUSTOMER_FOLDER__index, 'Ich_bin_der_neue_name')
was noch wichtig wäre die Struktur also die Anordnung wo etwas steht
muss beibehalten werden...
ich hoffe ihr könnt mir hierbei weiter helfen
Hier noch ein Bild für eine Darstellung:
https://imgur.com/a/OgejzO0
vielen dank im Voraus!
Re: Dictionary anpassen / bearbeiten
Verfasst: Sonntag 8. August 2021, 20:48
von Sirius3
Es ist seltsam, dass Du eine Konstante verändern willst.
Wenn ich das richtig sehe, möchtest Du eigentlich eine verschachtelte Struktur von Wörterbüchern haben und keine Listen. Und die mehrfache Speicherung der Verzeichnisnamen solltest Du löschen.
Code: Alles auswählen
customer_folder = {
'Kunden Übersicht': {
'01_Beschreibung': {
'Beschriftung Verteilungen.smg': {},
'Beschriftung Verteilungen.xlsx': {},
},
'02_Materiallisten': {
'Projekt-name': {
'Eintragungen': {},
'Geschlossen': {},
'Zwischenrechnung': {},
},
},
'03_Prüfungen': {},
'04_KNX': {},
'05_Bilder': {},
'06_Notizen': {},
'07_Datenbank': {},
}
}
customer_overview = customer_folder['Kunden Übersicht']
customer_overview['Ich_bin_der_neue_name'] = customer_overview.pop('02_Materiallisten')
Re: Dictionary anpassen / bearbeiten
Verfasst: Montag 9. August 2021, 17:29
von Kalysto
Hallo Sirius3,
Danke erst einmal für deine Antwort.
Sirius3 hat geschrieben: Sonntag 8. August 2021, 20:48
Es ist seltsam, dass Du eine Konstante verändern willst.
Wie in dem bsp. Bild welches ich oben eingefügt hatte ist dies ein "Verzeichnis" welches ich abbilden möchte deshalb wollte und würde ich gerne auch dementsprechende Namens Anpassungen abändern wollen.
Sirius3 hat geschrieben: Sonntag 8. August 2021, 20:48
Und die mehrfache Speicherung der Verzeichnisnamen solltest Du löschen.
Diese Benötige ich aber für die Darstellung meines Verzeichnisses denn anhand deines Beispiels funktioniert nun der Aufruf der Unterordner
nicht mehr...
Dieser Teil des Codes sorgt dafür was ausgeben und Dargestellt wird....
ich wusste mir somit nicht anders zu Helfen das ich her ging und aus dem:
Code: Alles auswählen
'02_Materiallisten': {
'Projekt-name': {
'Eintragungen': {},
'Geschlossen': {},
'Zwischenrechnung': {},
das mache:
Code: Alles auswählen
'02_Materiallisten': {
'02_Materiallisten/Projekt-name': {
'02_Materiallisten/Projekt-name/Eintragungen': {},
'02_Materiallisten/Projekt-name/Geschlossen': {},
'02_Materiallisten/Projekt-name/Zwischenrechnung': {},
somit wusste ich immer das die Richtigen Zeilen ausgegeben werden würden...
oder kann man das hier z.b. besser lösen das es "richtig" wäre und nicht nur auf Funktion aufgebaut wird ?
Sirius3 hat geschrieben: Sonntag 8. August 2021, 20:48
customer_overview['Ich_bin_der_neue_name'] = customer_overview.pop('02_Materiallisten')
.pop('') kannte ich bereits aber dies ist nicht richtig da ich die Anordnung so beibehalten muss wie sie "erstellt" wurde da sonst meine Ordner verschoben währe und nicht mehr 01_.... 02_.... 03_... abgegeildet werden würden...
vllt gibt es hierzu auch einen besseren weg als ich ihn vorhabe zu gehen oder kann man Wörterbücher evtl. sogar sortieren nach einem bestimmten Zahlen wert den ich hinzufügen könnte... ?
bin für vorschlage offen

Re: Dictionary anpassen / bearbeiten
Verfasst: Montag 9. August 2021, 20:14
von __blackjack__
@Kalysto: Man wählt Datenstrukturen nach den Operationen die man darauf ausführen will. Nicht alles geht mit jeder Struktur gut, einiges sogar sehr schlecht. Mir scheint es gibt hier nicht die eine Struktur, beziehungsweise müsstest Du halt schauen welche Operationen Dir wichtiger sind das sie einfach gehen und bei welchen Du halt Arbeit in Form von Code und Laufzeit stecken willst.
Wenn Du was mit einer Reihenfolge haben möchtest, die frei änderbar ist, dann sind Wörterbücher das falsche Mittel. Wenn Du effizient über Schlüssel auf Werte zugreifen willst, dann sind Listen das falsche Mittel. Manchmal wählt das für einige Operationen falsche Mittel und schreibt dann halt den ineffizienten Code dafür. Manchmal bastelt man sich einen eigenen Datentyp der redundante Datenstrukturen enthält um einige, aber nicht alle Operationen effizient zu haben. Manchmal schreibt man Code der die Daten zwischen zwei Repräsentationen hin und her wandeln kann, um die jeweils effizienten Operationen auf der passenden Datenstruktur ausführen zu können. Halt mit dem Mehraufwand der Umwandlungen.
Was da jetzt für Deinen Anwendungsfall am meisten Sinn macht, kann man nicht sagen ohne zu wissen was genau mit der Datenstruktur passieren soll, und auch wie oft und auf welchen Datenmengen und wie die üblicherweise aussehen.
Re: Dictionary anpassen / bearbeiten
Verfasst: Montag 9. August 2021, 20:28
von Kalysto
__blackjack__ hat geschrieben: Montag 9. August 2021, 20:14
@Kalysto: Man wählt Datenstrukturen nach den Operationen die man darauf ausführen will. Nicht alles geht mit jeder Struktur gut, einiges sogar sehr schlecht. Mir scheint es gibt hier nicht die eine Struktur, beziehungsweise müsstest Du halt schauen welche Operationen Dir wichtiger sind das sie einfach gehen und bei welchen Du halt Arbeit in Form von Code und Laufzeit stecken willst.
Wenn Du was mit einer Reihenfolge haben möchtest, die frei änderbar ist, dann sind Wörterbücher das falsche Mittel. Wenn Du effizient über Schlüssel auf Werte zugreifen willst, dann sind Listen das falsche Mittel. Manchmal wählt das für einige Operationen falsche Mittel und schreibt dann halt den ineffizienten Code dafür. Manchmal bastelt man sich einen eigenen Datentyp der redundante Datenstrukturen enthält um einige, aber nicht alle Operationen effizient zu haben. Manchmal schreibt man Code der die Daten zwischen zwei Repräsentationen hin und her wandeln kann, um die jeweils effizienten Operationen auf der passenden Datenstruktur ausführen zu können. Halt mit dem Mehraufwand der Umwandlungen.
Was da jetzt für Deinen Anwendungsfall am meisten Sinn macht, kann man nicht sagen ohne zu wissen was genau mit der Datenstruktur passieren soll, und auch wie oft und auf welchen Datenmengen und wie die üblicherweise aussehen.
Naja, was damit passieren soll hatte ich ja gesagt.
Ich müsste entsprechend der Ebene Neune Einträge einfügen und bearbeiten können....
Hier einmal ein bsp.
Dies hier wäre nun angenommen mein leeres „Wörterbuch“:
Nun hatte ich vor für jeden Ordner / Datei eine Ebene zu vergeben „structure„ oder wie man es nennen möchte
Code: Alles auswählen
customer_folder = {
'Kunden Übersicht': {
'structurer': {
2: {},
'01_Beschreibung': {
'Beschriftung Verteilungen.smg': {},
'Beschriftung Verteilungen.xlsx': {},
},
},
'structuree': {
1: {},
'02_Materiallisten': {
'Projekt-name': {
'Eintragungen': {},
'Geschlossen': {},
'Zwischenrechnung': {},
},
},
},
}
}
Jeder dieser Einträge:
Code: Alles auswählen
'structuree': {
1: {},
'02_Materiallisten': {
'Projekt-name': {
'Eintragungen': {},
'Geschlossen': {},
'Zwischenrechnung': {},
},
},
},
Stellt somit einen Ordner oder Datei dar in diesen fällen sind es Ordner.
Ich möchte nun erreichen das anhand der Strcture das „Wörterbuch“ sortiert werden würde das die Einträge am Ende so aussehen und ausgegeben werden würden:
Code: Alles auswählen
customer_folder = {
'Kunden Übersicht': {
'structuree': {
1: {},
'02_Materiallisten': {
'Projekt-name': {
'Eintragungen': {},
'Geschlossen': {},
'Zwischenrechnung': {},
},
},
},
'structurer': {
2: {},
'01_Beschreibung': {
'Beschriftung Verteilungen.smg': {},
'Beschriftung Verteilungen.xlsx': {},
},
},
}
}
Nun wäre die Frage ob das überhaupt machbar ist und wenn ja wie ich das anstellen könnte....
Am besten wäre hierzu ein bsp. Das ich einen Anfang hätte womit ich selbst einmal probieren könnte.
Mit freundlichen Grüßen
Kalysto
Re: Dictionary anpassen / bearbeiten
Verfasst: Montag 9. August 2021, 20:33
von __deets__
Das geht halt mit Wörterbüchern nicht oder nur umständlich. Warum müssen das Wörterbücher sein? Wer konsumiert diese Datenstruktur, und warum kann man das nicht ändern?
Re: Dictionary anpassen / bearbeiten
Verfasst: Montag 9. August 2021, 20:50
von Kalysto
Das muss ja nicht zwingend ein Wörterbuch sein

Was würdet ihr dafür empfehlen ?
Was auch ein „noob“ hinbekommen würde.
__deets__ hat geschrieben: Montag 9. August 2021, 20:33
Wer konsumiert diese Datenstruktur, und warum kann man das nicht ändern?
Das kann ich ja dementsprechend wieder anpassen solange es funktioniert

Re: Dictionary anpassen / bearbeiten
Verfasst: Montag 9. August 2021, 21:53
von YAPD
Hi,
gib mir einen Moment, dann kann ich dir sehr wahrscheinlich helfen
VG
YAPD
Re: Dictionary anpassen / bearbeiten
Verfasst: Dienstag 10. August 2021, 11:12
von __blackjack__
@Kalysto: Also ich habe mir noch mal die Ausgangsfrage angeschaut und finde das reicht nicht um wirklich zu verstehen was gefordert ist. Natürlich sehe ich was da nach welchem Muster gemacht wurde, und man könnte jetzt auch Code schreiben der das macht, aber da weiss man immer noch nicht ob und was von diesem Einzelbeispiel auf die tatsächliche Anforderung übertragbar ist und was nicht. Ist die Tiefe der Struktur fix und darum gibt es auch ”Pfade” als Schlüssel? Ist dann immer der erste Teil des Pfads der geändert wird, oder kann das auch mal ein Teilpfad mitten drin sein? Warum sind die Daten eigentlich redundant in der Form, dass der Schlüssel auch immer Präfix bei den Werten ist? Oder ist das gar nicht immer der Fall sondern nur in diesem Beispiel? Ist "Kunden Übersicht" ein besonderer Schlüssel? Warum sind die Werte dahinter redundant zu den anderen Schlüsseln? Und was macht man wenn man mal ein Verzeichnis "Kunden Übersicht" haben will? Dann kollidieren die Schlüssel und das geht nicht? Berücksichtigt der Code den Fall und meldet so einen Fehler explizit?
Fragen über Fragen. Ich würde ja als erstes mal nur die Daten modellieren. Ohne Redundanzen. Wenn man sich auf Grunddatentypen beschränkt, sähe das wohl so aus:
Code: Alles auswählen
customer_folder = [
(
"01_Beschreibung",
[
"Beschriftung Verteilungen.smg",
"Beschriftung Verteilungen.xlsx",
],
),
(
"02_Materiallisten",
[
(
"Projekt-name",
["Eintragungen", "Geschlossen", "Zwischenrechnung"],
)
],
),
("03_Prüfungen", []),
("04_KNX", []),
("05_Bilder", []),
("06_Notizen", []),
("07_Datenbank", []),
]
Verzeichnisse/Innere Knoten werden als Tupel repräsentiert, Dateien/Blätter als Zeichenkette. Wobei ich mir bei "Eintragungen", "Geschlossen", und "Zwischenrechnung" nicht sicher bin ob das innere Knoten oder Blätter sein sollen. Das ist wieder so ein Punkt an dem Dein Beispiel ohne weitere Erklärung was das alles bedeuten soll, nicht ausreicht.
Grunddatentypen sind hier zwar ausreichend um die Struktur zu zeigen/definieren, aber wenn man damit nun arbeiten möchte, müsste man anfangen mit `isinstance()` (oder besser `functools.singledispatch()`) zwischen inneren Knoten und Blättern zu unterscheiden. In einer objektorientierten Programmiersprache ist da aber auch der Punkt wo man sich überlegen kann/sollte dafür eigene Datentypen zu definieren.
Re: Dictionary anpassen / bearbeiten
Verfasst: Dienstag 10. August 2021, 14:06
von YAPD
Hi,
mir geht es so wie Sirius. Ich versteh die ganze Systematik hinter deiner Anfrage nicht.
Wieso soll 02_Metarialliste genau umbenannt werden und wie heißt der Ordner dann.
"02_Projekte" ?. Wie soll der übergeordnete Key / Ordner heissen ? Ist es z.B. ein Standort
( was passen würde anhand der Struktur und dass man dann die Projekte je Standort
aufgelistet hätte. Oder ist es der Kundenname. So ist es für mich schwer, es
programmiertechnisch umzusetzen.
VG
YAPD
Re: Dictionary anpassen / bearbeiten
Verfasst: Dienstag 10. August 2021, 16:28
von YAPD
Hi Kalysto,
schau mal, ob du damit etwas anfangen kannst. Ich habe mich
an deiner Beschreibung orientiert und die Struktur je nach Kunde
aufgebaut :
Code: Alles auswählen
import re
import os
t_customer_folders = {
"Overview": [
"01_Beschreibung",
"02_Utilities",
"03_Prüfung",
"04_KNX",
"05_Bilder",
"06_Briefe",
"07_DB",
]
}
customer_infos = [
"01 Beschreibung\Beschriftung Verteiler.msg",
"01 Beschreibung\Beschriftung Verteiler.xlsx",
]
t_customer_utilities = [
"02_Utilities\PRJ",
"02_Utilities\PRJ\Eintraege",
"02_Utilities\PRJ\Closed",
"02_Utilities\PRJ\Rechnung",
]
customers = {
"IBM": ["Projekt I", "Projekt II", "Projekt III"],
"Apple": ["Projekt IV", "Projekt V", "Projekt VI"],
}
prj_folder = "02_Projekte"
home_directory = os.getcwd()
indexer = t_customer_folders["Overview"].index("02_Utilities")
t_customer_folders["Overview"][indexer] = t_customer_folders["Overview"][indexer].replace("02_Utilities", f"{prj_folder}")
for customer in customers:
print("\nCreating Structure For Customer : {}".format(customer))
print("Home Directory : {} \n".format(home_directory))
path_customer = os.path.join(home_directory, customer)
# Create Folder
# os.mkdir(path_customer)
for folder in t_customer_folders["Overview"]:
print("Creating Folder :", folder)
path_folders = os.path.join(home_directory, customer, folder)
# Create Folder
# os.mkdir(path_folders)
if folder == "01_Beschreibung":
print( "\nCreating Sub - Folders For {} !\n".format(folder))
for info in customer_infos :
print( info )
path_info = os.path.join( home_directory , customer , info )
# os.mkdir( path_info )
print( )
if folder == "02_Projekte":
print("\nCreating PRJ Folders :\n")
for p in customers[customer]:
for utility in t_customer_utilities:
new = utility.replace("02_Utilities\\PRJ", f"02_Projekte\\{p}")
print(new)
path_projects = os.path.join(home_directory, customer, new)
# Create Folder
# os.mkdir(path_projects)
print()
Ausgabe :
Code: Alles auswählen
Creating Structure For Customer : IBM
Home Directory : D:\Learning\Python
Creating Folder : 01_Beschreibung
Creating Folder : 02_Projekte
Creating PRJ Folders :
02_Projekte\Projekt I
02_Projekte\Projekt I\Eintraege
02_Projekte\Projekt I\Closed
02_Projekte\Projekt I\Rechnung
02_Projekte\Projekt II
02_Projekte\Projekt II\Eintraege
02_Projekte\Projekt II\Closed
02_Projekte\Projekt II\Rechnung
02_Projekte\Projekt III
02_Projekte\Projekt III\Eintraege
02_Projekte\Projekt III\Closed
02_Projekte\Projekt III\Rechnung
Creating Folder : 03_Prüfung
Creating Folder : 04_KNX
Creating Folder : 05_Bilder
Creating Folder : 06_Briefe
Creating Folder : 07_DB
Creating Structure For Customer : Apple
Home Directory : D:\Learning\Python
Creating Folder : 01_Beschreibung
Creating Folder : 02_Projekte
Creating PRJ Folders :
02_Projekte\Projekt IV
02_Projekte\Projekt IV\Eintraege
02_Projekte\Projekt IV\Closed
02_Projekte\Projekt IV\Rechnung
02_Projekte\Projekt V
02_Projekte\Projekt V\Eintraege
02_Projekte\Projekt V\Closed
02_Projekte\Projekt V\Rechnung
02_Projekte\Projekt VI
02_Projekte\Projekt VI\Eintraege
02_Projekte\Projekt VI\Closed
02_Projekte\Projekt VI\Rechnung
Creating Folder : 03_Prüfung
Creating Folder : 04_KNX
Creating Folder : 05_Bilder
Creating Folder : 06_Briefe
Creating Folder : 07_DB
ANMERKUNG : Da ich auch noch relativ unerfahren bin, was Python angeht und noch
nicht so lange mit dieser Programmiersprache arbeite, werden wahrscheinlich noch
Anmerkungen von den Erfahreneren hier erscheinen, die sagen, das der Code sehr
ineffizient ist. Ich habe es leider nicht besser hingekriegt.
VG
YAPD
Re: Dictionary anpassen / bearbeiten
Verfasst: Dienstag 10. August 2021, 17:03
von YAPD
Beachte, dass die sich Ausgabe geändert hat, ich konnte
meinen vorherigen Post leider nicht mehr bearbeiten :
Code: Alles auswählen
Creating Structure For Customer : IBM
Home Directory : D:\Learning\Python
Creating Folder : 01_Beschreibung
Creating Sub - Folders For 01_Beschreibung !
01 Beschreibung\Beschriftung Verteiler.msg
01 Beschreibung\Beschriftung Verteiler.xlsx
Creating Folder : 02_Projekte
Creating PRJ Folders :
02_Projekte\Projekt I
02_Projekte\Projekt I\Eintraege
02_Projekte\Projekt I\Closed
02_Projekte\Projekt I\Rechnung
02_Projekte\Projekt II
02_Projekte\Projekt II\Eintraege
02_Projekte\Projekt II\Closed
02_Projekte\Projekt II\Rechnung
02_Projekte\Projekt III
02_Projekte\Projekt III\Eintraege
02_Projekte\Projekt III\Closed
02_Projekte\Projekt III\Rechnung
Creating Folder : 03_Prüfung
Creating Folder : 04_KNX
Creating Folder : 05_Bilder
Creating Folder : 06_Briefe
Creating Folder : 07_DB
Creating Structure For Customer : Apple
Home Directory : D:\Learning\Python
Creating Folder : 01_Beschreibung
Creating Sub - Folders For 01_Beschreibung !
01 Beschreibung\Beschriftung Verteiler.msg
01 Beschreibung\Beschriftung Verteiler.xlsx
Creating Folder : 02_Projekte
Creating PRJ Folders :
02_Projekte\Projekt IV
02_Projekte\Projekt IV\Eintraege
02_Projekte\Projekt IV\Closed
02_Projekte\Projekt IV\Rechnung
02_Projekte\Projekt V
02_Projekte\Projekt V\Eintraege
02_Projekte\Projekt V\Closed
02_Projekte\Projekt V\Rechnung
02_Projekte\Projekt VI
02_Projekte\Projekt VI\Eintraege
02_Projekte\Projekt VI\Closed
02_Projekte\Projekt VI\Rechnung
Creating Folder : 03_Prüfung
Creating Folder : 04_KNX
Creating Folder : 05_Bilder
Creating Folder : 06_Briefe
Creating Folder : 07_DB
Außerdem habe ich keine Fehlerbehandlung eingebaut, das heißt, sollte
ein Verzeichnis schon existieren, bricht es mit Fehler ab. Das müsstest
du ggf noch einbauen.
Code: Alles auswählen
try:
os.mkdir( path_customer )
except FileExistsError:
print("Directory '{}' Is Already Exisiting !".format(path_customer) )
next
VG
YAPD
Re: Dictionary anpassen / bearbeiten
Verfasst: Dienstag 10. August 2021, 17:25
von AlexL
@Kalysto
Ich habe versucht, den Thread zu verstehen. Klappt aber nicht. Was ist der genaue Sinn hinter dieser Übung?
Ich bin auch Python-Anfänger und möchte dazu lernen.
Deine "Struktur" sieht für mich eher nach Datenbankkonzept aus.
Wozu brauchst diese zig Ordner überhaupt? Und wie willst du das je mal bereinigen, wenn es stark angewachsen ist? Evtl 1000 Ordner per Hand umfummeln?
Ab einen bestimmten Umfang an strukturierbaren Daten würde ich zuerst eine DBMS ins Auge fassen. Das kann viel Arbeit später sparen.
Sorry für meine naiven Fragen.
Re: Dictionary anpassen / bearbeiten
Verfasst: Dienstag 10. August 2021, 17:34
von YAPD
AlexL hat geschrieben: Dienstag 10. August 2021, 17:25
@Kalysto
Ich habe versucht, den Thread zu verstehen. Klappt aber nicht. Was ist der genaue Sinn hinter dieser Übung?
Ich bin auch Python-Anfänger und möchte dazu lernen.
Deine "Struktur" sieht für mich eher nach Datenbankkonzept aus.
Wozu brauchst diese zig Ordner überhaupt? Und wie willst du das je mal bereinigen, wenn es stark angewachsen ist? Evtl 1000 Ordner per Hand umfummeln?
Ab einen bestimmten Umfang an strukturierbaren Daten würde ich zuerst eine DBMS ins Auge fassen. Das kann viel Arbeit später sparen.
Sorry für meine naiven Fragen.
Ich denke, dass der Sinn hinter der Übung ist, eine Struktur variabel erstellen zu können,
je nachdem, wie der Kunde bzw. das Projekt heisst.
VG
YAPD
Re: Dictionary anpassen / bearbeiten
Verfasst: Dienstag 10. August 2021, 19:02
von Kalysto
__blackjack__ hat geschrieben: Dienstag 10. August 2021, 11:12
@Kalysto: Also ich habe mir noch mal die Ausgangsfrage angeschaut und finde das reicht nicht um wirklich zu verstehen was gefordert ist. Natürlich sehe ich was da nach welchem Muster gemacht wurde, und man könnte jetzt auch Code schreiben der das macht, aber da weiss man immer noch nicht ob und was von diesem Einzelbeispiel auf die tatsächliche Anforderung übertragbar ist und was nicht. Ist die Tiefe der Struktur fix und darum gibt es auch ”Pfade” als Schlüssel? Ist dann immer der erste Teil des Pfads der geändert wird, oder kann das auch mal ein Teilpfad mitten drin sein? Warum sind die Daten eigentlich redundant in der Form, dass der Schlüssel auch immer Präfix bei den Werten ist? Oder ist das gar nicht immer der Fall sondern nur in diesem Beispiel? Ist "Kunden Übersicht" ein besonderer Schlüssel? Warum sind die Werte dahinter redundant zu den anderen Schlüsseln? Und was macht man wenn man mal ein Verzeichnis "Kunden Übersicht" haben will? Dann kollidieren die Schlüssel und das geht nicht? Berücksichtigt der Code den Fall und meldet so einen Fehler explizit?
Fragen über Fragen. Ich würde ja als erstes mal nur die Daten modellieren. Ohne Redundanzen. Wenn man sich auf Grunddatentypen beschränkt, sähe das wohl so aus:
Code: Alles auswählen
customer_folder = [
(
"01_Beschreibung",
[
"Beschriftung Verteilungen.smg",
"Beschriftung Verteilungen.xlsx",
],
),
(
"02_Materiallisten",
[
(
"Projekt-name",
["Eintragungen", "Geschlossen", "Zwischenrechnung"],
)
],
),
("03_Prüfungen", []),
("04_KNX", []),
("05_Bilder", []),
("06_Notizen", []),
("07_Datenbank", []),
]
Verzeichnisse/Innere Knoten werden als Tupel repräsentiert, Dateien/Blätter als Zeichenkette. Wobei ich mir bei "Eintragungen", "Geschlossen", und "Zwischenrechnung" nicht sicher bin ob das innere Knoten oder Blätter sein sollen. Das ist wieder so ein Punkt an dem Dein Beispiel ohne weitere Erklärung was das alles bedeuten soll, nicht ausreicht.
Grunddatentypen sind hier zwar ausreichend um die Struktur zu zeigen/definieren, aber wenn man damit nun arbeiten möchte, müsste man anfangen mit `isinstance()` (oder besser `functools.singledispatch()`) zwischen inneren Knoten und Blättern zu unterscheiden. In einer objektorientierten Programmiersprache ist da aber auch der Punkt wo man sich überlegen kann/sollte dafür eigene Datentypen zu definieren.
Also, danke erst einmal für deine Antwort
1. Kunden Übersicht ist eine Datenstruktur die JEDER Kunde als Standard erhalten sollte Kunden Übersicht könnte also auch als bsp. in Mustermann, Max -- Heidelberg "angepasst" werden
2. Kunden Übersicht Wird nie als Ordner existieren da diese alle in der Form Nachname, Vorname -- Wohnort erstellt werden.
3. Kunden Übersicht wird nur dann in Nachname, Vorname -- Wohnort geändert wenn der Kunde einen speziellen order erhalten sollte
4. Das Komplette Skript Programm wie auch immer hat um die 20.000 Zeilen welche natürlich nicht tip top sind da ich schlicht kein Profi bin... aber es "macht was es soll"
- Das ganze läuft mit der IOS App Pythonista
- Welches bedeute ich kann bei allem was ich mache und "Programmiere" nur reines Python verwenden kein C/C+ etc...
- Ich verwalte mit dieser App meine Material ein und Ausgänge (3 Mann Betrieb)
- desweiteren kann ich Bilder auf mein NAS Laden etc..
- Jeder Kunde welcher erstellt wird nach dem Oben genannten Format enthält immer Standard Ordner welche ich im Moment in einer config.ini gesichert und abrufe:
- config.ini Ausschnitt:
Code: Alles auswählen
maindircustomer = 01_Kunde
maindircustomer_datenbank = 2021_03_14 -- Datenbank
maindircustomer_vorlagen = 2021_03_05 -- Vorlagen
maindircustomer_vorlagen__excel_beschriftung = Beschriftung Verteilungen.xlsx
maindircustomer_vorlagen__semilog_beschriftung = Beschriftung Verteilungen.smg
maindircustomer_vorlagen__excel_dguvv3 = Prüfvorlage DGUV V3.xlsx
subdircustomer_beschriftung = 01_Beschriftungen
subdircustomer_materiallisten = 02_Materiallisten
subdircustomer_prüfungen = 03_Prüfungen
subdircustomer_e_check = 01_E-Check
subdircustomer_dguvv3 = 02_DGUV V3
subdircustomer_wallbox = 03_Wallbox
subdircustomer_netzwerk = 04_Netzwerk
subdircustomer_knx = 04_KNX
subdircustomer_knx_projekte = 01_KNX Projekte
subdircustomer_domovea = 02_Domovea
subdircustomer_server = 03_Server
subdircustomer_opc = 04_OPC
subdircustomer_x1 = 05_X1
subdircustomer_eintragungen = Eintragungen
subdircustomer_zwischenrechnung = Zwischenrechnung
subdircustomer_abgeschlossen = Abgeschlossen
subdircustomer_bilder = 05_Bilder
subdircustomer_notizen = 06_Notizen
subdircustomer_datenbank = 07_Datenbank
subdircustomer_kunde = 01_Kunde
subdircustomer_projekte = 02_Projekte
- Das blöde an dieser Sache ist wenn ein Ordner neu hinzukommt oder etwas geändert wird muss ich immer die jeweiligen Dateien auf allen 3 iPhones austauschen und muss den Code manuell anpassen da der Ordner ja sonst nicht abgefragt werden würde..
Somit ist meine Idee dahinter ein Wörterbuch (oder was auch immer) zu erstellen diese auf meinem Server zu speichern und bei bedarf eben immer Herunter lade um so immer aktuelle Daten zu verwenden...
D.h. wie in der config.ini Datei zu sehen gibt es nur 3 Dateien zur Zeit: Prüfvorlage DGUV V3.xlsx, Beschriftung Verteilungen.smg, Beschriftung Verteilungen.xlsx der Rest sind alle Ordner.
Ich habe mit einem Wörterbuch begonnen weil ich ja irgendwo und irgend wie einmal starten musste und ich musste mir ja eine UI in Pythonista generieren welche mir nun meine Ordner und Dateien darstellen würde.
bis ich eben zu dem Problem kam das ich es nicht hinbekam Keys zu ändern und wenn ich sie änderte (z.b. mit .pop) wurden sie an das ende gestellt und somit stimmte meine Darstellung nicht mehr....
Zusammengefasst:
- Es gibt zur Zeit nur 3 Dateien jeweils mit .xxx zu erkennen
- ich bräuchte eine Struktur welche sozusagen flexibel in "allen" Richtungen wäre, da sich alle Ordner und Dateien veränderbar/umbenannt werden könnten
- spiele auch gerade mit dem Gedanken auf mysql zurückzugreifen und dies in eine Tabelle zu schreiben...
- Der file-picker welcher unter IOS läuft braucht auch eine bestimmt Struktur damit er die Daten abfragen kann wie ich es in meinem ersten Post dargestellt hatte.
- Das Wiederrum heißt ich muss das ganze auch "umwandeln" können damit ich das ganze auswerten kann sowie Visuell darstellen kann
Ich dachte zuerst das es hier mit dem Wörterbuch einen Trick geben würde das das nun nicht so geht wie ich wollte ahnte ich ja nicht.... denn dann ist das ganze eine Weit aus größere Angelegenheit als ich dachte....
Ich hoffe das das erst einmal als Info reicht und mir evtl. wer einen Tipp/Hilfestellung geben kann wie ich das ganze angehen könnte.
Mit freundlichen Grüßen
Kalysto
p.s. sry. für die Anfangs mauen Informationen.
Re: Dictionary anpassen / bearbeiten
Verfasst: Dienstag 10. August 2021, 19:03
von Kalysto
YAPD hat geschrieben: Dienstag 10. August 2021, 17:34
AlexL hat geschrieben: Dienstag 10. August 2021, 17:25
@Kalysto
Ich habe versucht, den Thread zu verstehen. Klappt aber nicht. Was ist der genaue Sinn hinter dieser Übung?
Ich bin auch Python-Anfänger und möchte dazu lernen.
Deine "Struktur" sieht für mich eher nach Datenbankkonzept aus.
Wozu brauchst diese zig Ordner überhaupt? Und wie willst du das je mal bereinigen, wenn es stark angewachsen ist? Evtl 1000 Ordner per Hand umfummeln?
Ab einen bestimmten Umfang an strukturierbaren Daten würde ich zuerst eine DBMS ins Auge fassen. Das kann viel Arbeit später sparen.
Sorry für meine naiven Fragen.
Ich denke, dass der Sinn hinter der Übung ist, eine Struktur variabel erstellen zu können,
je nachdem, wie der Kunde bzw. das Projekt heisst.
VG
YAPD
Das ganze ist keine Übung!
Re: Dictionary anpassen / bearbeiten
Verfasst: Dienstag 10. August 2021, 19:04
von Kalysto
YAPD hat geschrieben: Dienstag 10. August 2021, 16:28
Hi Kalysto,
schau mal, ob du damit etwas anfangen kannst. Ich habe mich
an deiner Beschreibung orientiert und die Struktur je nach Kunde
aufgebaut :
Code: Alles auswählen
import re
import os
t_customer_folders = {
"Overview": [
"01_Beschreibung",
"02_Utilities",
"03_Prüfung",
"04_KNX",
"05_Bilder",
"06_Briefe",
"07_DB",
]
}
customer_infos = [
"01 Beschreibung\Beschriftung Verteiler.msg",
"01 Beschreibung\Beschriftung Verteiler.xlsx",
]
t_customer_utilities = [
"02_Utilities\PRJ",
"02_Utilities\PRJ\Eintraege",
"02_Utilities\PRJ\Closed",
"02_Utilities\PRJ\Rechnung",
]
customers = {
"IBM": ["Projekt I", "Projekt II", "Projekt III"],
"Apple": ["Projekt IV", "Projekt V", "Projekt VI"],
}
prj_folder = "02_Projekte"
home_directory = os.getcwd()
indexer = t_customer_folders["Overview"].index("02_Utilities")
t_customer_folders["Overview"][indexer] = t_customer_folders["Overview"][indexer].replace("02_Utilities", f"{prj_folder}")
for customer in customers:
print("\nCreating Structure For Customer : {}".format(customer))
print("Home Directory : {} \n".format(home_directory))
path_customer = os.path.join(home_directory, customer)
# Create Folder
# os.mkdir(path_customer)
for folder in t_customer_folders["Overview"]:
print("Creating Folder :", folder)
path_folders = os.path.join(home_directory, customer, folder)
# Create Folder
# os.mkdir(path_folders)
if folder == "01_Beschreibung":
print( "\nCreating Sub - Folders For {} !\n".format(folder))
for info in customer_infos :
print( info )
path_info = os.path.join( home_directory , customer , info )
# os.mkdir( path_info )
print( )
if folder == "02_Projekte":
print("\nCreating PRJ Folders :\n")
for p in customers[customer]:
for utility in t_customer_utilities:
new = utility.replace("02_Utilities\\PRJ", f"02_Projekte\\{p}")
print(new)
path_projects = os.path.join(home_directory, customer, new)
# Create Folder
# os.mkdir(path_projects)
print()
Ausgabe :
Code: Alles auswählen
Creating Structure For Customer : IBM
Home Directory : D:\Learning\Python
Creating Folder : 01_Beschreibung
Creating Folder : 02_Projekte
Creating PRJ Folders :
02_Projekte\Projekt I
02_Projekte\Projekt I\Eintraege
02_Projekte\Projekt I\Closed
02_Projekte\Projekt I\Rechnung
02_Projekte\Projekt II
02_Projekte\Projekt II\Eintraege
02_Projekte\Projekt II\Closed
02_Projekte\Projekt II\Rechnung
02_Projekte\Projekt III
02_Projekte\Projekt III\Eintraege
02_Projekte\Projekt III\Closed
02_Projekte\Projekt III\Rechnung
Creating Folder : 03_Prüfung
Creating Folder : 04_KNX
Creating Folder : 05_Bilder
Creating Folder : 06_Briefe
Creating Folder : 07_DB
Creating Structure For Customer : Apple
Home Directory : D:\Learning\Python
Creating Folder : 01_Beschreibung
Creating Folder : 02_Projekte
Creating PRJ Folders :
02_Projekte\Projekt IV
02_Projekte\Projekt IV\Eintraege
02_Projekte\Projekt IV\Closed
02_Projekte\Projekt IV\Rechnung
02_Projekte\Projekt V
02_Projekte\Projekt V\Eintraege
02_Projekte\Projekt V\Closed
02_Projekte\Projekt V\Rechnung
02_Projekte\Projekt VI
02_Projekte\Projekt VI\Eintraege
02_Projekte\Projekt VI\Closed
02_Projekte\Projekt VI\Rechnung
Creating Folder : 03_Prüfung
Creating Folder : 04_KNX
Creating Folder : 05_Bilder
Creating Folder : 06_Briefe
Creating Folder : 07_DB
ANMERKUNG : Da ich auch noch relativ unerfahren bin, was Python angeht und noch
nicht so lange mit dieser Programmiersprache arbeite, werden wahrscheinlich noch
Anmerkungen von den Erfahreneren hier erscheinen, die sagen, das der Code sehr
ineffizient ist. Ich habe es leider nicht besser hingekriegt.
VG
YAPD
Danke für deinen Versuch mir hierbei zu helfen aber das ist leider nicht das was ich suche und benötige.
habe einen neuen Beitrag erstellt welcher vllt. mehr Informationen mit sich bringt.
danke aber dennoch für deine Mühe

Re: Dictionary anpassen / bearbeiten
Verfasst: Dienstag 10. August 2021, 20:38
von YAPD
Kalysto hat geschrieben: Dienstag 10. August 2021, 19:04
Danke für deinen Versuch mir hierbei zu helfen aber das ist leider nicht das was ich suche und benötige.
habe einen neuen Beitrag erstellt welcher vllt. mehr Informationen mit sich bringt.
danke aber dennoch für deine Mühe
Keine Ursache, aber ich denke gerade, dass du nicht genau weißt, was du überhaupt willst.
Oder ich verstehe deine Beschreibung nicht. Mein Code ist schon flexibel, sofern du die
Ordner über eine Config einliest. Willst du sie nun nur darstellen, oder auch auslesen
und vergleichen ? Die neuen Ordner müssen ja irgendwo herkommen ?
Re: Dictionary anpassen / bearbeiten
Verfasst: Dienstag 10. August 2021, 22:02
von rogerb
@Kalysto,
Kunden Übersicht ist eine Datenstruktur die JEDER Kunde als Standard erhalten sollte Kunden Übersicht könnte also auch als bsp. in Mustermann, Max -- Heidelberg "angepasst" werden
Wenn ich das richtig verstehe, gibt es eine feste Struktur für jeden Kunden und individuelle Kundendaten.
Das kann man natürlich auf viele verschiedene Arten abbilden, aber da du jetzt schon mit einem Dictionary angefangen hast kann man ja auch dabei bleiben.
Der Dictionary sollte aus unveränderlichen Knoten bestehen, die die Struktur darstellen. Die veränderlichen Daten sind daran angehängt.
So etwas hatte __blackjack__ doch auch schon beispielhaft gezeigt. Was funktioniert daran nicht?
Ansonsten gibt es doch die Möglichkeit die Daten in Google Drive, One Drive, Box, Drop Box und wie sie nicht alle heißen, abzulegen.
Evtl. lohnt es sich in ein kostengünstiges fertiges Kundenmanagement System zu investieren.
Deine Arbeitszeit hat ja auch einen Wert. Wenn du mehr als 1, 2 Stunden im Monat durch fertige Software einsparen kannst, rechnet sich doch so eine Anschaffung bestimmt schon.
Re: Dictionary anpassen / bearbeiten
Verfasst: Mittwoch 11. August 2021, 12:58
von AlexL
Kalysto hat geschrieben: Dienstag 10. August 2021, 19:02
__blackjack__ hat geschrieben: Dienstag 10. August 2021, 11:12
- spiele auch gerade mit dem Gedanken auf mysql zurückzugreifen und dies in eine Tabelle zu schreiben...
Dazu würde ich dir auch dringend raten. Warenwirtschaftssysteme - ob groß oder klein - lassen sich mit DBs gut umsetzen. Und da mit dem Essen ggf. noch zusätzlicher Appetit kommt, hast du es später leichter, das zu erweitern/abzuändern.
Um die Struktur zu erstellen und zu testen, würde ich erst mal ein grafisches DB Tool verwenden. Vlt. hilft dir das als Ausgangspunkt:
https://www.heise.de/download/product/m ... ools-51574
Python und Gui würde ich erst dann "anfassen", wenn die Datenbank "steht" und du mit den Abfragen gut zurecht kommst. Und möglichst gleich an Sicherung und Rücksicherung denken und praktisch ausprobieren.