web-dev-qa-db-ja.com

XLRD / Python:forループを使用してExcelファイルをdictに読み込む

15のフィールドと約2000の行があるExcelブックを読み、各行をPythonの辞書に変換したいと考えています。次に、各辞書をリストに追加します。ブックの一番上の行の各フィールドが各辞書内のキーになり、対応するセルの値が辞書内の値になるようにしたいと思います。すでに例を見てきました herehere ですが、少し違うことをしたいと思います。 2番目の例は動作しますが、辞書キーを設定してから各行を反復処理して値を取得する方が効率的であると思います。私のExcelファイルには、ディスカッションフォーラムからのデータが含まれており、次のようになります(明らかに列が増えています)。

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'

それで、フィールドidthread_idなど、辞書キーになります。辞書を次のようにしたい:

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

最初は、このようなコードをファイル全体で繰り返していましたが、一部のforループのスコープが間違っており、生成する辞書が多すぎます。私の初期コードは次のとおりです。

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)

どんな助けも大歓迎です。読んでくれてありがとう。

21
kylerthecreator

アイデアは、最初にヘッダーをリストに読み込むことです。次に、シートの行(ヘッダーの次から始まる)を反復処理し、ヘッダーキーと適切なセル値に基づいて新しい辞書を作成し、辞書のリストに追加します。

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}]

UPD(辞書の理解を広げる):

d = {}
for col_index in xrange(sheet.ncols):
    d[keys[col_index]] = sheet.cell(row_index, col_index).value 
40
alecxe
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
6
Kernel

これを試してください。以下のこの関数は、各行と列の辞書を含むジェネレーターを返します。

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))
3
yopiangi

このスクリプトを使用すると、Excelデータを辞書のリストに変換できます

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
1
khelili miliana

この答えは私を大いに助けてくれました!私はこれを約2時間行う方法をいじっていました。次に、このエレガントで短い答えを見つけました。ありがとう!

キーを使用してxlsをjsonに変換する方法が必要でした。

そのため、上記のスクリプトを次のようなjson printステートメントで適合させました。

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)
0
user2672938

最初に最初の行、すべての列、データを解析する別の関数だけを解析してキーを設定してから、順番に呼び出してみてください。

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)
0
user3203010