質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3671閲覧

どのようにエクセルのデータを辞書に入れるか?

退会済みユーザー

退会済みユーザー

総合スコア0

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/09/06 10:00

エクセルのデータを辞書に入れたいです。
エクセルは、
イメージ説明
のようになっています。
views.py に

#coding:utf-8 from django.shortcuts import render import xlrd book3 = xlrd.open_workbook('./data/excel.xlsx') sheet3 = book3.sheet_by_index(0) large_item = None data_dict = {} for row_index in range(1,sheet3.nrows): rows3 = sheet3.row_values(row_index) large_item = rows3[1] or large_item data_dict = rows3

のように書きました。

print(data_dict)

の結果は['', '4', '10', 'Karen', ''] のようになりました。
この前は、

data_dict = rows3

data_dict.extend(rows3)

のように書いていたのですが、dict has not extend というエラーが発生しました。

data_dict = { 1: { user_id: 1, name_id: 1, name: Blear, age: 40, man: false, employee: leader, }, 2: { user_id: 2, name_id: 5, ・ ・ ・ }, ・ ・ ・ }

のようなアウトプットにしたいのですが、どうしたら良いでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんな感じでしょうか。

Python

1import xlrd 2from pprint import pprint 3 4def try_to_int(arg): 5 try: 6 return int(arg) 7 except: 8 return arg 9 10def main(): 11 book3 = xlrd.open_workbook('./data/excel.xlsx') 12 sheet3 = book3.sheet_by_index(0) 13 14 data_dict = {} 15 tag_list = sheet3.row_values(0)[1:] 16 for row_index in range(1, sheet3.nrows): 17 row = sheet3.row_values(row_index)[1:] 18 row = list(map(try_to_int, row)) 19 data_dict[row_index] = dict(zip(tag_list, row)) 20 21 pprint(data_dict) 22 23if __name__ == '__main__': 24 main() 25 26"""出力 27{1: {'age': 40, 28 'empleyee': 'leader', 29 'man': '', 30 'name': 'Blear', 31 'name_id': 1, 32 'user_id': 1}, 33 2: {'age': 23, 34 'empleyee': 'others', 35 'man': '●', 36 'name': 'Tom', 37 'name_id': 5, 38 'user_id': 2}, 39 3: {'age': 52, 40 'empleyee': 'manager', 41 'man': '', 42 'name': 'Rose', 43 'name_id': 9, 44 'user_id': 3}, 45 4: {'age': '', 46 'empleyee': '', 47 'man': '', 48 'name': 'Karen', 49 'name_id': 10, 50 'user_id': 4}} 51"""

large_itemは仕様が分からなかったのでスルーしてます。
xlrdは初めて使ったので、慣習などは知りません。ご容赦ください。


いい練習になると思って、ジェネレータを使ってみた。

Python

1import xlrd 2from pprint import pprint 3 4def try_to_int(arg): 5 try: 6 return int(arg) 7 except: 8 return arg 9 10def read_all_row(worksheet, left_up=(0, 0)): 11 for i in range(left_up[0], worksheet.nrows): 12 ret_list = worksheet.row_values(i)[left_up[1]:] 13 yield list(map(try_to_int, ret_list)) 14 15def main(): 16 book3 = xlrd.open_workbook('./data/excel.xlsx') 17 sheet3 = book3.sheet_by_index(0) 18 19 data_dict = {} 20 tag_list = sheet3.row_values(0)[1:] 21 for i, row in enumerate(read_all_row(sheet3, left_up=(1, 1))): 22 data_dict[i] = dict(zip(tag_list, row)) 23 24 pprint(data_dict) 25 26if __name__ == '__main__': 27 main()

なんかすっきりしない。ラッパークラスを作った方がいいのかもしれない。

投稿2017/09/06 16:54

編集2017/09/07 08:44
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問