Excel to defaultdict(dict)

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
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

Ich habe eine Excel-Datei, die ich gern in defaultdict(dict) einlesen möchte:

Code: Alles auswählen

       ""                         ""                      ""         ""            ""          ""       ""
       ""                         ""                    "                       Adresse                    "
"Laufende Nummer"    "Positionstext Rechnungslegung"    "Name"    "Straße"    "Hausnummer"    "Ort"    "PLZ"
       ""                         ""                      ""         ""            ""          ""       ""
        101                   Mustertext                Gebers   Hansastraße     154         Irgendwo  1234
        102
        103
        104
Mein Code:

Code: Alles auswählen

    def import_IGM_FILE(self):
        col_list = []
        for col_index in range(self.WB_TABLE_WRITE.ncols):
            col = []
            for row_index in range(self.WB_TABLE_WRITE.nrows):
                valor = self.WB_TABLE_WRITE.cell(row_index, col_index).value
                for crange in self.WB_TABLE_WRITE.merged_cells:
                    rlo, rhi, clo, chi = crange
                    if rlo <= row_index < rhi and clo <= col_index < chi:
                        valor = self.WB_TABLE_WRITE.cell(rlo, clo).value
                        break
                col.append(valor)
            col_list.append(col)

        self.columns = defaultdict(dict)
        for (a, b, *c) in col_list:
            self.columns[a][b] = c
        return self.columns
Meine Ausgabe:

Code: Alles auswählen

 {'': ['', '', '', '', '', ''], 'Adresse': ['PLZ', '', 49666.0, '', '', '']}
Und wenn ich eine Zeile zugebe, bekomme ich eine Fehlermeldung:

Code: Alles auswählen

        self.columns = defaultdict(dict)
        for (a, b, c, *d) in col_list:
            self.columns[a][b][c] = d
        return self.columns
Felermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:/Users/colling/Documents/PyCharm/Dateiimport/MAIN.py", line 61, in <module>
    imp.main()
  File "C:/Users/colling/Documents/PyCharm/Dateiimport/MAIN.py", line 41, in main
    IGM.IGM_IMPORT(sheet_name, self.INPUT_FILE, output_igm_path)
  File "C:\Users\colling\Documents\PyCharm\Dateiimport\IGM.py", line 30, in __init__
    self.import_IGM_FILE()
  File "C:\Users\colling\Documents\PyCharm\Dateiimport\IGM.py", line 49, in import_IGM_FILE
    self.columns[a][b][c] = d
KeyError: ''
Vielleicht kann mir jemand helfen.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Wie soll denn die Datenstruktur hinterher aussehen?
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

ich möchte jede spalte auslesen, so wie sie oben steht. zusammengefügte zeilen sollen entsprechend übernommen werden.
Also so (ungefähr)...

Code: Alles auswählen

{
" :{ " :{'Laufende \nNummer': ['', 101, 102, 103, 104], '' :{'Positionstext Rechnungslegung': ['', Mustertext, '', '', '']},
" :{ 'Adresse' :{'Name': ['', Gebers, '', '', ''], 'Straße': ['', Hansastraße, '', '', ''], 'Ort': ['', Irgendwo, '', '', ''], 'PLZ': ['', 1234, '', '', '']}
}
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Warum willst du die denn in eine solche Form bringen?
Für die Weiterverarbeitung ist das doch sehr ungünstig, weil du die ganzen einzelnen Datensätze zerpflückst.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Und bist du dir sicher, dass du den Effekt haben möchtest, dass an eine Instanzvariable (nämlich self.columns) zu binden?
Wenn man das tut und das ganze anschließend per return zurück gibt, ist das zumindest seltsam.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OS: das hatten wir doch vor einer Weile schon einmal. Du willst nicht die gemergten Zellen irgendwie aufteilen, sondern komplett ignorieren, weil die gesamte Header-Information in Zeile 3 steht. Du kannst also mit Pandas die Excel-Datei in einem Rutsch lesen, wenn Du die ersten beiden Zeilen ignorierst und hast dann eine schöne Struktur zum Weiterarbeiten.
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

wieso taucht denn ÜBERHAUPT der fehler auf, den ich da bekomme???
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DMD-OS: Weil es den Schlüssel in dem normalen `dict` nicht gibt‽ Warum hast Du den Fehler da nicht erwartet? Was hätte denn Deiner Meinung nach stattdessen passieren sollen?
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten