2014-05-09 5 views
13

के साथ धक्का में पढ़ना मैं 15 फ़ील्ड और लगभग 2000 पंक्तियों के साथ एक एक्सेल वर्कबुक में पढ़ना चाहता हूं, और प्रत्येक पंक्ति को पायथन में एक शब्दकोश में परिवर्तित करना चाहता हूं। मैं फिर प्रत्येक शब्दकोश को एक सूची में जोड़ना चाहता हूं। मैं प्रत्येक शब्दकोष के भीतर एक कुंजी होने के लिए कार्यपुस्तिका की शीर्ष पंक्ति में प्रत्येक फ़ील्ड चाहता हूं, और संबंधित सेल मान शब्दकोश के भीतर मान हो। मैंने पहले ही here और here उदाहरण देखे हैं, लेकिन मैं कुछ अलग करना चाहता हूं। दूसरा उदाहरण काम करेगा, लेकिन मुझे लगता है कि यह कुंजी पंक्तियों को पॉप्युलेट करने के लिए शीर्ष पंक्ति पर अधिक कुशल लूपिंग होगा और फिर मान प्राप्त करने के लिए प्रत्येक पंक्ति के माध्यम से फिर से सक्रिय होगा। मैं क्षेत्रों चाहें id, thread_id और इतने पर, शब्दकोश कुंजी हो सकता है, तोएक्सएलआरडी/पायथन: एक्सेल फ़ाइल को फोर-लूप

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' 

: मेरा Excel फ़ाइल चर्चा मंचों से डेटा होता है और (अधिक कॉलम के साथ स्पष्ट रूप से) कुछ इस तरह लग रहा है। मैं की तरह लग रहे करने के लिए मेरे शब्दकोशों चाहते हैं: प्रारंभ में

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

, मैं फ़ाइल के माध्यम से इस बार दोहराना जैसे कुछ कोड था, लेकिन मेरे क्षेत्र के लिए-छोरों से कुछ के लिए गलत है और मैं जिस तरह से पैदा कर रहा हूँ बहुत सारे शब्दकोशों। यहां मेरा प्रारंभिक कोड है:

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) 

किसी भी मदद की सराहना की जाएगी। पढ़ने के लिए अग्रिम धन्यवाद।

+0

एक के रूप में की सूची में कोई एक्सेल डेटा को बदलने के लिए, यदि आप एक तरह से तालिका डेटा कि में संग्रहीत हो जाता है जोड़ तोड़ करने जा रहे हैं की अनुमति देते हैं एक्सेल फ़ाइलें, आपको ['पांडास'] (http://pandas.pydata.org) में रुचि हो सकती है; यह उन चीजों को बनाएगा जिन्हें आपने अभी तक आसान नहीं माना है। (उदाहरण के लिए, यदि आपको पसंद आया तो आपका पूरा कोड एक पंक्ति हो सकता है।) – DSM

+0

@DSM: आरईसी के लिए धन्यवाद। मुझे पांडा के बारे में पता है, लेकिन मैं खुद को कुछ भारी उठाना चाहता था क्योंकि मैंने सोचा था कि यह एक अच्छा सीखने का अनुभव करेगा। भविष्य में उसमें देख रहे हैं, हालांकि। – kylerthecreator

उत्तर

30

विचार है, सबसे पहले सूची में शीर्षलेख पढ़ें। फिर, चादर पंक्तियों (हेडर के बाद अगले से शुरू) से अधिक पुनरावृति, नया शब्दकोश बनाने के हैडर कुंजी और उचित सेल मूल्यों पर आधारित और शब्दकोशों की सूची से संलग्न:

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 

एक पत्रक युक्त के लिए:

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

यह प्रिंट:

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

युपीडी (समझ शब्दकोश के विस्तार):

+०१२३५१६४१०६
d = {} 
for col_index in xrange(sheet.ncols): 
    d[keys[col_index]] = sheet.cell(row_index, col_index).value 
+1

यह वास्तव में उत्कृष्ट है। एक और बात: क्या आप 'डी' के परिवर्तनीय असाइनमेंट वाली लाइनों को अवधारणात्मक रूप से तोड़ने के इच्छुक होंगे? मैं कुछ कारणों से नेस्टेड फॉर-लूप का पालन करने में सक्षम नहीं हूं। एक बार फिर धन्यवाद। यह वास्तव में सहायक है। – kylerthecreator

+1

@kylerthecreator yup, अद्यतन देखें। एफवाईआई, 'कुंजी में कुंजी के लिए' अनइडेड लूप था जो वहां नहीं होना चाहिए - मैंने इसे भी हटा दिया है। पहले जैसा ही काम करता है। – alecxe

0

डेटा को पार्स करने के लिए केवल पहली पंक्ति, सभी कॉलम, एक अन्य फ़ंक्शन को पार्स करके अपनी कुंजी सेट अप करने का प्रयास करें, फिर उन्हें क्रम में कॉल करें।

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

इस उत्तर ने मुझे बहुत मदद की! मैं लगभग दो घंटों तक ऐसा करने के तरीके से झुका रहा था। तब मुझे यह सुरुचिपूर्ण और संक्षिप्त जवाब मिला। धन्यवाद!

मुझे चाबियों का उपयोग करके एक्सएलएस से जेसन को बदलने के लिए कुछ तरीका चाहिए।

तो मैं तो जैसे एक json प्रिंट बयान से ऊपर स्क्रिप्ट अनुकूलित:

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

इस एक कोशिश करें। नीचे दिया गया यह कार्य जनरेटर लौटाएगा प्रत्येक पंक्ति और कॉलम के निर्देश।

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

यह स्क्रिप्ट आप एक तरफ 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 
संबंधित मुद्दे