XLRD/Python: Excel 파일을 dict로 읽고 for-loops를 사용합니다.
15개의 필드와 약 2000개의 행이 있는 Excel 워크북을 읽고 각 행을 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_workbook('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
dict_list.append(d)
어떤 도움이라도 주시면 감사하겠습니다.읽어주셔서 감사합니다.
이 아이디어는 먼저 헤더를 목록으로 읽어 들이는 것입니다.그런 다음 시트 행에 걸쳐 반복하고(헤더 다음부터 시작), 헤더 키와 적절한 셀 값을 기반으로 새 사전을 만들어 사전 목록에 추가합니다.
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
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
이거 드셔보세요.아래 함수는 각 행과 열의 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))
먼저 첫 번째 줄, 모든 열, 데이터를 구문 분석하는 다른 함수를 구문 분석하여 키를 설정한 후 순서대로 호출합니다.
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)
이 스크립트를 사용하면 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
또한 당신은 그 쉬운 방법으로 할 수 있다.
book = open_workbook('forum.xlsx')
sheet = book.sheet_by_index(3)
header=book.rows_values(0)
dict_list=list()
d = dict()
for i in range(sheet.ncols):
d[header[i]]=sheet.cell_value(1,i)
dict_list.append(d)
print(d)
언급URL : https://stackoverflow.com/questions/23568409/xlrd-python-reading-excel-file-into-dict-with-for-loops
'programing' 카테고리의 다른 글
Windows에서 Jenkins 서비스 시작/중지 및 재시작 (0) | 2023.04.14 |
---|---|
WPF에서 Ctrl + Tab과 Ctrl + Shift + Tab을 캡처하는 방법 (0) | 2023.04.14 |
윈도우즈에서 cron 작업 설정 (0) | 2023.04.14 |
UIImageView에서 이미지 변경을 애니메이션으로 만드는 방법 (0) | 2023.04.14 |
Git: 리모트 오리진 마스터에서 단일 파일을 업데이트/체크아웃하는 방법 (0) | 2023.04.14 |