2017-04-11 7 views
-1

Ive sah sich um, kann aber keine einfache Lösung finden, um mein Blatt in ein Wörterbuch zu konvertieren. Mein Blatt sieht so aus, wobei jede Zeichenfolge in einer eigenen Zeile steht und die Spalten davor leer sind. Kann ich das leicht in ein Wörterbuch umwandeln oder muss ich die leeren Zellen mit Werten füllen?Excel Blatt zu Python dict

Edit für Klarheit: die Bindestriche sind nur da, um die leeren Spalten vor den Werten darzustellen. Ich habe sowohl eine xls als auch eine csv Datei der Daten. Das Diktat sollte die ersten Spalten als Schlüssel enthalten, dann die zweite und dritte als "Unterschlüssel (?)" Und vierte Zeile als Werte. Das Blatt aussehen wie this, und ich plane ich diese

key 1 
----value 1 
--------value a 
--------value b 
--------value c 
----value 2 
--------value d 
--------value e 
key 2 
----value 3 
--------value f 
--------value g 
--------value h 
----value 4 
--------value i 
--------value j 
+1

Haben Sie * eigentlich * eine Excel-Datei (wie eine 'xls' /' xlsx' Datei) oder nur eine CSV-Datei? Warum wird Ihre Datei so eingerichtet, wie Sie sie beschreiben? Sind die Bindestriche Teil Ihrer Datei? Wie soll das resultierende Diktat aussehen? –

+0

Ich habe versucht, der Frage Klarheit zu geben – Louvre

+1

sieht Ihr '.xls' Dateiinhalt so aus? http://i.imgur.com/CsjdE91.png – davedwards

Antwort

1

Ich schäme mich dieses sehr chaotisch Antwort zu schreiben, in einem QTreeView zu verwenden, aber da es hier die einzige Antwort sein werde, werde ich es posten sowieso. Nur so konnte ich herausfinden, wie man ein solches verschachteltes Wörterbuch aus einer Tabelle erstellt.

Leider ist es hart codiert - es wäre viel besser, es dynamisch zu bauen, wenn ich es später verbessern kann, werde ich aktualisieren.

import xlrd 

book = xlrd.open_workbook("data.xls") 
sh = book.sheet_by_index(0) 
d = dict(dict()) 

c1 = [str(c.value) for c in sh.col(0) if c.value != ''] 
c2 = [str(c.value) for c in sh.col(1) if c.value != ''] 
c3 = [str(c.value) for c in sh.col(2) if c.value != ''] 

val1 = c2[0] 
val2 = c2[1] 
val3 = c2[2] 
val4 = c2[3] 

v1 = {val1: c3[0:3]} 
v2 = {val2: c3[3:5]} 
v3 = {val3: c3[5:8]} 
v4 = {val4: c3[8:10]} 

k1 = {c1[0]: [v1, v2]} 
k2 = {c1[1]: [v3, v4]} 

d.update(k1) 
d.update(k2) 

Dann drucken Sie das Wörterbuch:

import pprint 
pprint.pprint(d) 
    {'key 1': [{'value 1': ['value a', 'value b', 'value c']}, 
       {'value 2': ['value d', 'value e']}], 
    'key 2': [{'value 3': ['value f', 'value g', 'value h']}, 
       {'value 4': ['value i', 'value j']}]} 

Bis eine bessere Antwort entlang kommt, ich hoffe, dass dies etwas hilft.

+0

@Louvre wolltest du immer noch versuchen, die Zeilen dynamisch zu machen? – davedwards