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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

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

Q&A

解決済

1回答

1365閲覧

txtをJSON化したい

Male_soprano

総合スコア10

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

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

0グッド

0クリップ

投稿2020/08/18 05:46

初歩的な質問で恐縮です.
テキストファイルの中から一部を抽出し,辞書・JSON化したいと考えています.
しかし,望んだ出力が得られずにいます.具体的に解決したい点としては,

・時間とユーザー名の出力がtxtの最終行に引っ張られているので,順番通りに表示させたい
・JSONに通し番号をつけたい

の2点です.

解決して,下記のような出力を得たいと考えています(「理想の出力結果」参照).
解決策をご教示いただけますと幸いです.宜しくお願いします.

該当のソースコード

python

1#!/usr/bin/python 2# -*- coding: utf-8 -*- 3import re 4import pyautogui as pg 5import requests as rq 6import json as js 7import glob 8import os 9from datetime import datetime as dt 10from io import StringIO 11 12#ファイルを開く 13#年月日を抽出して曜日を削除 14for line in open("test.txt", encoding="utf-8"): 15 ma = re.search("202[0-9].[0-9]{1,2}.[0-9]{1,2}", line) 16 if ma: 17 tdt = dt.strptime(ma.group(0), '%Y.%m.%d') 18 ymd = tdt.strftime('%Y-%m-%d') 19 #print(tstr) 20 21#時間,ユーザー名,メッセージを抽出 22line3 = [] 23for line2 in open("test.txt", encoding="utf-8"): 24 mb = re.search("[0-9][0-9]:[0-9][0-9]", line2) 25 if mb: 26 list = line2.split() 27 time = list[0] 28 hms = time + ":00" 29 time = ymd + " " + hms 30 print(time) 31 32 name = list[1] 33 message = list[2] 34 35 line3.append(message) 36 else: 37 list = line2.split() 38 39 if (len(list) < 2): 40 line3[len(line3)-1] += list[0] 41 42for line4 in line3: 43 message = line4 44 45 #jsonに変換 46 dict = {'time':time, 'name':name, 'message':message} 47 result = js.dumps(dict, ensure_ascii=False) 48 print(result) 49 #r = requests.post("https://m4nlxro2rk.execute-api.ap-northeast-1.amazonaws.com/prod/", data=result) 50 #print(r.text)

txt

12020.08.13 木曜日 223:58 ポプ子 えいえい!怒った? 323:59 ピピ美 怒ってないよ. 42020.08.14 金曜日 501:00 天の声 何気ないマンボが 6サンバ師匠をきずつけた 701:30 ポプ子 エサヒィ~スープゥードゥラァァァ~イ!!! 802:00 ピピ美 しょーがねーだろ赤ちゃんなんだから

現在の出力結果

{"time": "2020-08-14 02:00:00", "name": "ピピ美", "message": "えいえい!怒った?"} {"time": "2020-08-14 02:00:00", "name": "ピピ美", "message": "怒ってないよ."} {"time": "2020-08-14 02:00:00", "name": "ピピ美", "message": "何気ないマンボがサンバ師匠を傷つけた"} {"time": "2020-08-14 02:00:00", "name": "ピピ美", "message": "エサヒィ~スープゥードゥラァァァ~イ!!!"} {"time": "2020-08-14 02:00:00", "name": "ピピ美", "message": "しょーがねーだろ赤ちゃんなんだから"}

理想の出力結果

{1:{time:"2020-08-13 23:58:00", name:"ポプ子", message:"えいえい!怒った?"}, 2:{time:"2020-08-13 23:59:00", name:"ピピ美", message:"怒ってないよ."}, 3:{time:"2020-08-14 01:00:00", name:"天の声", message:"何気ないマンボが サンバ師匠をきずつけた"}, 4:{time:"2020-08-14 01:30:00", name:"ポプ子", message:"エサヒィ~スープゥードゥラァァァ~イ!!!"}, 5:{time:"2020-08-14 02:00:00", name:"ピピ美", message:"しょーがねーだろ赤ちゃんなんだから"}}

補足情報(FW/ツールのバージョンなど)

MacOS10.15.4, Python3.7.3, Atom

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

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

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

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

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

guest

回答1

0

ベストアンサー

根本的に処理を見直しています。

Python

1import datetime 2import json 3 4# テストデータ 5from io import StringIO 6s = """2020.08.13 木曜日 723:58 ポプ子 えいえい!怒った? 823:59 ピピ美 怒ってないよ. 92020.08.14 金曜日 1001:00 天の声 何気ないマンボが 11サンバ師匠をきずつけた 1201:30 ポプ子 エサヒィ~スープゥー 13ドゥラァァァ~イ!!! 1402:00 ピピ美 しょーがねーだろ赤ちゃんなんだから""" 15 16 17# 1行追加 18def append_one(l): 19 if len(l) > 0: 20 dt = datetime.datetime.strptime( date + ' ' + time, '%Y.%m.%d %H:%M') 21 dt = dt.strftime('%Y-%m-%d %H:%M:%S') 22 ret.append({'time':dt, 'name':name, 'message':''.join(l)}) 23 return [] 24 25ret = [] 26date = time = name = '' 27mes = [] 28for line in StringIO(s): 29 cols = line.split() 30 n_col = len(cols) 31 32 if n_col == 1: # セリフのみ 33 mes.append(cols[0]) # セリフをためる 34 elif n_col == 2: # 日付と曜日 35 mes = append_one(mes) # 1行追加 36 date = cols[0] 37 elif n_col == 3: # 時刻と人物とセリフ 38 mes = append_one(mes) # 1行追加 39 time = cols[0] 40 name = cols[1] 41 mes.append(cols[2]) # セリフを貯める 42 43append_one(mes) # 1行追加 44 45# リスト→辞書 46ret = {i+1:e for i,e in enumerate(ret)} 47 48 49s = json.dumps(ret, ensure_ascii=False, indent=4) 50print(s) 51"""

結果

{ "1": { "time": "2020-08-13 23:58:00", "name": "ポプ子", "message": "えいえい!怒った?" }, "2": { "time": "2020-08-13 23:59:00", "name": "ピピ美", "message": "怒ってないよ." }, "3": { "time": "2020-08-14 01:00:00", "name": "天の声", "message": "何気ないマンボがサンバ師匠をきずつけた" }, "4": { "time": "2020-08-14 01:30:00", "name": "ポプ子", "message": "エサヒィ~スープゥードゥラァァァ~イ!!!" }, "5": { "time": "2020-08-14 02:00:00", "name": "ピピ美", "message": "しょーがねーだろ赤ちゃんなんだから" } }

投稿2020/08/18 05:59

can110

総合スコア38278

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

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

Male_soprano

2020/08/18 06:09

参考にします.有難うございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問