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

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

新規登録して質問してみよう
ただいま回答率
85.51%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

4回答

7560閲覧

Python 3 テキストファイルから読み込んだデータを辞書型の要素を持つリスト型の変数に代入したい

khaii21

総合スコア63

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2018/05/30 07:56

編集2018/05/30 08:03

前提・実現したいこと

Python 3です。
1行にリスト型の形式で記載したデータのテキストファイルがあります。
一つ一つの要素は全て辞書型となるように記載しています。
出来ればこのまま単純にデータを読み込んで、全ての要素が辞書型となる
リスト型の変数に代入したいです。

例:sample.txt

[{"id": "3", "name": "Jone", "age": "23"}, {"id": "1", "name": "Anne", "age": "17"}, {"id": "2", "name": "Ken", "age": "21"}]

発生している問題・エラーメッセージ

テキストファイルからread()関数で読み込むと、読み込んだデータは文字列型となるため、 変数に代入しても要素の一つ一つが辞書型にはなりません。

該当のソースコード

sample_txt = "sample.txt" data_list = [] with open(sample_txt, "r") as f: data_list = f.read()

試したこと

データの前後に付いている '[' と ']' を取り除き、{}単位で要素をsplit関数で分割して
リスト型の変数に代入しましたが、一つ一つの要素を辞書型に変換できません。

with open(sample_txt, "r") as f: line = f.read() line_str = line.replace("[", "").replace("]", "").replace("},", "}},") data_list = re.split(r"},", line_str)

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

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

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

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

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

guest

回答4

0

ベストアンサー

ast.literal_evalを使うと一発で出来ます。

Python

1from ast import literal_eval 2from pprint import pprint 3 4text = r'[{"id": "3", "name": "Jone", "age": "23"}, {"id": "1", "name": "Anne", "age": "17"}, {"id": "2", "name": "Ken", "age": "21"}]' 5lst = literal_eval(text) 6 7pprint(lst) 8print(type(lst), type(lst[0]))

実行結果 Wandbox

plain

1[{'age': '23', 'id': '3', 'name': 'Jone'}, 2 {'age': '17', 'id': '1', 'name': 'Anne'}, 3 {'age': '21', 'id': '2', 'name': 'Ken'}] 4<class 'list'> <class 'dict'>

投稿2018/05/30 08:05

編集2018/05/30 08:07
LouiS0616

総合スコア35658

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

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

can110

2018/05/30 08:13

tuple,list,dict,setなど各型に対応しているので、json.loadsよりも汎用性がありますね。
khaii21

2018/05/30 08:26

ご教授ありがとうございます。 やりたい事がイメージ通り叶いました。
guest

0

こういうときはjson.loadsが便利です。
文字列をjson形式とみなしてPythonオブジェクトに変換できます。

追記

今回のケースではjson.loadsでも可能ですが、tuple,list,dict,setなど任意の型に変換できるliteral_evalのほうが汎用性は高いです。

Python

1import json 2data_list = '[{"id": "3", "name": "Jone", "age": "23"}, {"id": "1", "name": "Anne", "age": "17"}, {"id": "2", "name": "Ken", "age": "21"}]' 3data_list = json.loads(data_list) 4print(data_list) 5for d in data_list: 6 print(d) 7 8# json.loadsではtuple,setなどは変換不可。 9from ast import literal_eval 10s = "[1,(1,2),{'id':123},{'a','b','c'}]" 11l = literal_eval(s) 12for i in l: 13 print(type(i),i)

投稿2018/05/30 08:03

編集2018/05/30 08:17
can110

総合スコア38230

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

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

khaii21

2018/05/30 08:24

ご教授ありがとうございます。 追記もありがとうございました。
guest

0

ちょっと荒業ですが、Pythonの中でPythonの文として実行させましょう。 eval() を使います。

python

1data_list = [] # 後のデータ取り出しのためにここで宣言しておく。 2 3with open(sample_txt, "r") as f: 4 line = f.read() 5 data_list = exec(line) # ここでテキストをPythonコードとして実行させる。 6 7print(data_list[0]['id']) # きっとここで「3」という文字列が出力されるはず……

参考資料

2. 組み込み関数 — Python 3.6.5 ドキュメント

投稿2018/05/30 08:09

manzyun

総合スコア2244

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

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

khaii21

2018/05/30 08:22

ご教授ありがとうございます。 まだまだ初心者の域から脱せられていないので、とても勉強になりました。
guest

0

eval(ファイルから読み込んだ文字列)とすると元のオブジェクトに変換できるかと。
ただしセキュリティ上の問題があるので、一人で使うなら構いませんが、そうでないときはこの方法は避けてください。

投稿2018/05/30 08:03

hayataka2049

総合スコア30933

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

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

khaii21

2018/05/30 08:22

ご教授ありがとうございます。 セキュリティに問題もあるのですね。 とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問