質問するログイン新規登録
Python 3.x

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

Q&A

解決済

3回答

1717閲覧

ファイルから読み込んだデータを辞書に変換したい

City

総合スコア25

Python 3.x

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

0グッド

0クリップ

投稿2018/03/17 11:59

0

0

Pythonファイルから読み込んだデータを辞書に変換したいです。
何か良い方法はありませんでしょうか...
どうかよろしくお願いいたします。

Python

1# openfile.py からfileを読み込みます。 2 3with open(file,"r",encoding="utf_8") as f : 4 text = f.read() 5 6""" 7 8これ以降どうすればよいのやら... 9 10 newtext = list(text) 11 dic = dict(newtext) 12 13とすると 14 15['(', "'", 'u', 's', 'e', 'r', '1', "'", ',', "'", 'p', 'a', 's', 's', 'w', 'o', 'r', 'd', '1', "'", ')', '\n', ',', '(', "'", 'u', 's', 'e', 'r', '2', "'", ',', "'", 'p', 'a', 's', 's', 'w', 'o', 'r', 'd', '2', "'", ')', '\n'] 16 17 18リストもタプルも rstrip("\n,") など使えないようですし、 19 理想である 20 {'username1':'password1','username2':'password2'} 21 辞書としての値の受け取り 22 23からは程遠いものになってしまいます... 24 25"""

Python

1 2# 読み込む file.py の中身です。 3 4('username1','password1') 5,('username2','password2') 6

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

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

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

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

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

LouiS0616

2018/03/17 12:18

file.pyはどうして.pyファイルにしたのでしょうか。
City

2018/03/17 12:20

.txt以外は可能なのかどうかを試してみて.pyでうまくいったときの感動が大きかったからです。変更しても何の差しさわりもない(特に意味はない)です。
wakame

2018/03/17 12:38

file.pyのフォーマットを変えてあげたほうが読み込むプログラムをそこまで工夫せず作成できるかなと思いました。
City

2018/03/17 13:16

.txtにすることにしました。アドバイスありがとうございます。(`・ω・´)ゞ
guest

回答3

0

ベストアンサー

無理矢理書いてみました。 Wandbox
正規表現に苦手意識があるので、無駄な処理をしてしまっている気がしますが。

Python

1import re 2 3pattern = re.compile(r"""(?<=()'\w+'.'\w+'(?=))""") 4 5data_dict = {} 6with open('file.txt') as f: 7 for row in f: 8 find_obj = re.findall(pattern, row)[0] 9 10 key, value = map(lambda x: x.strip("'"), find_obj.split(',')) 11 data_dict[key] = value 12 13print(data_dict)

file.txtの内容が非常に扱いづらいので、こちらの形式を扱いやすく変えた方が現実的です。

例えば

json形式だと非常に楽です。Wandbox

Python

1import json 2 3with open('file.json') as f: 4 data_dict = json.load(f) 5 6print(data_dict)

file.json

plain

1{ 2 "username1": "password1", 3 "username2": "password2" 4}

もしファイルの生成・読み取りの自動化を狙っているのなら、こちらの方が良いでしょう。

今更だけど

ちょっとだけシンプルにリライトしました。Wandbox

Python

1import re 2 3pattern = re.compile(r"""([\w|'|,]+)""") 4 5data_dict = {} 6with open('file.txt') as f: 7 for row in f: 8 find_obj = re.findall(pattern, row)[0] 9 10 key, value = map(lambda x: x.strip("(')"), find_obj.split(',')) 11 data_dict[key] = value 12 13print(data_dict)

投稿2018/03/17 12:34

編集2018/03/17 17:15
LouiS0616

総合スコア35678

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

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

City

2018/03/17 13:15

回答ありがとうございます。 辞書の値として受け取ることは可能なのですね! 詳しい解答をいただいたLouiSo0616さんの親切に感謝いたします。 無事解決することができそうです。
guest

0

データファイルを読み込み、カッコの中味を解析し、1つ目と2つ目の要素を抽出して辞書に登録していく、ということをすればいいと思われます。

投稿2018/03/17 12:30

編集2018/03/17 12:31
y_waiwai

総合スコア88182

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

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

City

2018/03/17 13:09

回答ありがとうございます。 そのようなコードがかけるほどの力がないことを残念に思う次第です...笑
guest

0

質問にある入力テキストファイルを JSON 形式に書き換えるプログラム (convert.py)
JSON 形式ファイルをよみこんでオブジェクトをつくるプログラム (read_json.py)
の2つをつくることにします。
次のように実行します。

$ cat data.txt | python3 convert.txt > data.json $ python3 read_json.py

実行例
イメージ説明

convert.py

python

1import sys, re 2 3regex = re.compile(r"^.?('(.*)','(.*)')$") 4 5print("{", end="") 6for num, line in enumerate(sys.stdin, 1): 7 line = line.strip() 8 m = re.match(regex, line) 9 print("" if num == 1 else ",") 10 print(' "{}": "{}"'.format(m.group(1), m.group(2)), end="") 11print("\n}")

read_json.py

python

1import json 2 3try: 4 with open('data.json', 'r') as f: 5 data = json.load(f) 6 print(data) 7except json.JSONDecodeError as e: 8 print('JSON Error: ', e)

投稿2018/03/17 16:27

katoy

総合スコア22328

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

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

City

2018/03/18 00:00

へぇ、catはファイルを連結するのか... ということは、os.system("cat ....")として一件落着の予感です katoyさんも不思議に辞書型に変換しています... 近い将来コードの意味を全部理解できるようにがんばります!!(`・ω・´)
City

2018/03/18 01:07

ありがとうございます。 簡単な辞書の扱いを可能にしてくれるモジュールなんですね! jsonには期待がかかります..
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問