XLRD/Python: чтение файла Excel в dict с for-loop
Я ищу для чтения в книге Excel с 15 полями и около 2000 строк и конвертирует каждую строку в словарь в Python. Затем я хочу добавить каждый словарь в список. Я хотел бы, чтобы каждое поле в верхней строке книги являлось ключом в каждом словаре, а соответствующее значение ячейки - значение внутри словаря. Я уже рассмотрел примеры здесь и здесь, но я хотел бы сделать что-то немного другое. Второй пример будет работать, но я чувствую, что более эффективная петля над верхней строкой будет заполнять ключи словаря, а затем перебирать каждую строку, чтобы получить значения. Мой файл 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'
Итак, мне нужны поля id
, thread_id
и т.д., чтобы быть клавишами словаря. Я бы хотел, чтобы мои словари выглядели так:
{id: 4,
thread_id: 100,
forum_id: 3,
post_time: 1377000566,
votes: 1,
post_text: 'here is some text'}
Изначально у меня был такой код, как это, итерация через файл, но моя область не подходит для некоторых из циклов for-loops, и я генерирую слишком много словарей. Здесь мой начальный код:
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)
Любая помощь будет принята с благодарностью. Заранее благодарим за чтение.
Ответы
Ответ 1
Идея состоит в том, чтобы, во-первых, прочитать заголовок в списке. Затем, итерации по строкам листа (начиная с следующего после заголовка), создайте новый словарь на основе клавиш заголовка и соответствующих значений ячеек и добавьте его в список словарей:
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
Ответ 2
Попробуйте это.
Эта функция ниже возвращает генератор, содержащий dict каждой строки и столбца.
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
Этот ответ очень помог мне! Я тренировался, чтобы сделать это около двух часов. Затем я нашел этот элегантный и короткий ответ. Спасибо!
Мне нужно было каким-то образом преобразовать xls в json, используя ключи.
Итак, я адаптировал script выше с помощью команды 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)
Ответ 4
Попробуйте сначала настроить свои ключи, разыгрывая только первую строку, все столбцы, другую функцию для анализа данных, а затем вызывайте их в порядке.
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)
Ответ 5
Этот script позволяет преобразовать данные excel в список 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
Ответ 6
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