2014-05-09 3 views
13

Ich möchte eine Excel-Arbeitsmappe mit 15 Feldern und etwa 2000 Zeilen einlesen und jede Zeile in ein Wörterbuch in Python konvertieren. Ich möchte dann jedes Wörterbuch an eine Liste anhängen. Ich möchte, dass jedes Feld in der obersten Zeile der Arbeitsmappe ein Schlüssel in jedem Wörterbuch ist und der entsprechende Zellenwert der Wert im Wörterbuch ist. Ich habe mir schon die Beispiele here und here angesehen, aber ich möchte etwas anderes machen. Das zweite Beispiel funktioniert, aber ich habe das Gefühl, dass es effizienter wäre, die oberste Zeile zu durchlaufen, um die Wörterbuchschlüssel zu füllen, und dann durch jede Zeile zu iterieren, um die Werte zu erhalten. Meine Excel-Datei enthält Daten von Diskussionsforen und sieht ungefähr so ​​aus (natürlich mit mehr Spalten):XLRD/Python: Excel-Datei in dict mit for-loops lesen

id thread_id forum_id post_time votes post_text 
4  100   3   1377000566 1  'here is some text' 
5  100   4   1289003444 0  'even more text here' 

Also, ich mag die Felder id, thread_id und so weiter, der Dictionary-Schlüssel sein. Ich würde meine Wörterbücher gerne wie folgt aussehen:

{id: 4, 
thread_id: 100, 
forum_id: 3, 
post_time: 1377000566, 
votes: 1, 
post_text: 'here is some text'} 

Anfangs hatte ich einige Code wie dieser Iterieren durch die Datei, aber mein Bereich ist für einen Teil der for-Schleifen falsch und ich bin zu erzeugen viel zu viele Wörterbücher. Hier ist mein ursprünglicher Code:

import xlrd 
from xlrd import open_workbook, cellname 

book = open('forum.xlsx', 'r') 
sheet = book.sheet_by_index(3) 

dict_list = [] 

for row_index in range(sheet.nrows): 
    for col_index in range(sheet.ncols): 
     d = {} 

     # My intuition for the below for-loop is to take each cell in the top row of the 
     # Excel sheet and add it as a key to the dictionary, and then pass the value of 
     # current index in the above loops as the value to the dictionary. This isn't 
     # working. 

     for i in sheet.row(0): 
      d[str(i)] = sheet.cell(row_index, col_index).value 
      dlist.append(d) 

Jede Hilfe würde sehr geschätzt werden. Vielen Dank im Voraus für das Lesen.

+0

Als Nebenwirkung eines Excel-Daten zu transformieren, wenn Sie Tabellendaten von der Art sein werden manipulieren, die in gespeichert werden Excel-Dateien, könnten Sie interessiert sein an ['Pandas'] (http://pandas.pydata.org); es wird Dinge machen, an die Sie noch nicht einmal gedacht haben. (Zum Beispiel könnte Ihr gesamter Code eine Zeile sein, wenn Sie möchten.) – DSM

+0

@DSM: danke für die rec. Ich kenne Pandas, wollte aber selbst schweres Heben machen, weil ich dachte, dass es eine gute Lernerfahrung machen würde. Ich werde mir das in Zukunft genauer ansehen. – kylerthecreator

Antwort

30

Die Idee ist, zuerst den Header in die Liste zu lesen. Dann iterieren die Blattreihen (ab dem nächsten nach dem Header), neue Wörterbuch basiert auf Kopfschlüssel und entsprechende Zellenwerte und fügen Sie sie in die Liste der Wörterbücher:

from xlrd import open_workbook 

book = open_workbook('forum.xlsx') 
sheet = book.sheet_by_index(3) 

# read header values into the list  
keys = [sheet.cell(0, col_index).value for col_index in xrange(sheet.ncols)] 

dict_list = [] 
for row_index in xrange(1, sheet.nrows): 
    d = {keys[col_index]: sheet.cell(row_index, col_index).value 
     for col_index in xrange(sheet.ncols)} 
    dict_list.append(d) 

print dict_list 

Für ein Blatt enthält:

A B C D 
1 2 3 4 
5 6 7 8 

druckt:

[{'A': 1.0, 'C': 3.0, 'B': 2.0, 'D': 4.0}, 
{'A': 5.0, 'C': 7.0, 'B': 6.0, 'D': 8.0}] 

UPD (das Wörterbuch Verständnis erweitert):

d = {} 
for col_index in xrange(sheet.ncols): 
    d[keys[col_index]] = sheet.cell(row_index, col_index).value 
+1

Das ist wirklich hervorragend. Noch etwas: Wären Sie bereit, die Zeilen mit der Variablenzuordnung von "d" konzeptionell zu zerlegen? Ich kann die verschachtelten For-Schleifen aus irgendeinem Grund nicht verfolgen. Danke noch einmal. Das ist sehr hilfreich. – kylerthecreator

+1

@ kylerthecreator yup, siehe das Update. FYI, es gab eine "für Schlüssel in Schlüssel" nicht benötigte Schleife, die nicht da sein sollte - ich habe es auch entfernt. Funktioniert wie zuvor. – alecxe

0

Versuchen Sie, zuerst Ihre Schlüssel einzurichten, indem Sie nur die erste Zeile, alle Spalten, eine andere Funktion analysieren, um die Daten zu analysieren, und rufen Sie sie dann der Reihe nach auf.

all_fields_list = [] 
header_dict = {} 
def parse_data_headers(sheet): 
    global header_dict 
    for c in range(sheet.ncols): 
     key = sheet.cell(1, c) #here 1 is the row number where your header is 
     header_dict[c] = key #store it somewhere, here I have chosen to store in a dict 
def parse_data(sheet): 
    for r in range(2, sheet.nrows): 
     row_dict = {} 
     for c in range(sheet.ncols): 
      value = sheet.cell(r,c) 
      row_dict[c] = value 
     all_fields_list.append(row_dict) 
1

Diese Antwort hat mir sehr geholfen! Ich habe ungefähr zwei Stunden lang mit einem Weg getüftelt. Dann fand ich diese elegante und kurze Antwort. Vielen Dank!

Ich brauchte eine Möglichkeit, xls mit Schlüsseln in Json zu konvertieren.

So angepasst ich das Skript oben mit einer json print-Anweisung wie folgt:

from xlrd import open_workbook 
import simplejson as json 
#http://stackoverflow.com/questions/23568409/xlrd-python-reading-excel-file-into-dict-with-for-loops?lq=1 

book = open_workbook('makelijk-bomen-herkennen-schors.xls') 
sheet = book.sheet_by_index(0) 

# read header values into the list 
keys = [sheet.cell(0, col_index).value for col_index in xrange(sheet.ncols)] 
print "keys are", keys 

dict_list = [] 
for row_index in xrange(1, sheet.nrows): 
    d = {keys[col_index]: sheet.cell(row_index, col_index).value 
     for col_index in xrange(sheet.ncols)} 
    dict_list.append(d) 

#print dict_list 
j = json.dumps(dict_list) 

# Write to file 
with open('data.json', 'w') as f: 
    f.write(j) 
2

versuchen diese. Diese Funktion unten liefert Generator enthält dict jeder Zeile und Spalte.

from xlrd import open_workbook 

for row in parse_xlsx(): 
    print row # {id: 4, thread_id: 100, forum_id: 3, post_time: 1377000566, votes: 1, post_text: 'here is some text'} 

def parse_xlsx(): 
    workbook = open_workbook('excelsheet.xlsx') 
    sheets = workbook.sheet_names() 
    active_sheet = workbook.sheet_by_name(sheets[0]) 
    num_rows = active_sheet.nrows 
    num_cols = active_sheet.ncols 
    header = [active_sheet.cell_value(0, cell).lower() for cell in range(num_cols)] 
    for row_idx in xrange(1, num_rows): 
     row_cell = [active_sheet.cell_value(row_idx, col_idx) for col_idx in range(num_cols)] 
     yield dict(zip(header, row_cell)) 
0

Dieses Skript können Sie zur Liste Dictionnary

import xlrd 

workbook = xlrd.open_workbook('forum.xls') 
workbook = xlrd.open_workbook('forum.xls', on_demand = True) 
worksheet = workbook.sheet_by_index(0) 
first_row = [] # The row where we stock the name of the column 
for col in range(worksheet.ncols): 
    first_row.append(worksheet.cell_value(0,col)) 
# tronsform the workbook to a list of dictionnary 
data =[] 
for row in range(1, worksheet.nrows): 
    elm = {} 
    for col in range(worksheet.ncols): 
     elm[first_row[col]]=worksheet.cell_value(row,col) 
    data.append(elm) 
print data 
0
from xlrd import open_workbook 

dict_list = [] 
book = open_workbook('forum.xlsx') 
sheet = book.sheet_by_index(3) 

# read first row for keys 
keys = sheet.row_values(0) 

# read the rest rows for values 
values = [sheet.row_values(i) for i in range(1, sheet.nrows)] 

for value in values: 
    dict_list.append(dict(zip(keys, value))) 

print dict_list