Dictionary anpassen / bearbeiten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

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!
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

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')
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

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...

Code: Alles auswählen

names = self.CUSTOMER_FOLDER[self.path]
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 :D
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

__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“:

Code: Alles auswählen

customer_folder = {
    'Kunden Übersicht': {
    }
}
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
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

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 ;)
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

Hi,

gib mir einen Moment, dann kann ich dir sehr wahrscheinlich helfen :)

VG
YAPD
-----
Yet Another Python Developer
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

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
-----
Yet Another Python Developer
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

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
-----
Yet Another Python Developer
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

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
-----
Yet Another Python Developer
AlexL
User
Beiträge: 16
Registriert: Donnerstag 5. August 2021, 10:38

@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.
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

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
-----
Yet Another Python Developer
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

__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.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

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!
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

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 ;)
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

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 ?
-----
Yet Another Python Developer
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@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.
AlexL
User
Beiträge: 16
Registriert: Donnerstag 5. August 2021, 10:38

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.
Antworten