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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

713閲覧

文字列を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/23 07:15

編集2020/08/23 08:00

初歩的な質問で恐縮です.
テキストファイルの中から一部を抽出し,辞書・JSON化を目指していて,その過程でファイル内で読み込まれた文字列を丸ごと三連引用符で囲まれるようにしたいと考えております..
しかし,以下のようなエラーが吐き出されました.

「理想の出力結果」に表記されているような結果を得るべく,原因と解決策をご教示いただけますと幸いです.宜しくお願いします.

エラー

Traceback (most recent call last): File "pyautogui_penta2.py", line 44, in <module> mes = append_one(mes) # 1行追加 File "pyautogui_penta2.py", line 26, in append_one dt = datetime.datetime.strptime( date + ' ' + time, '%Y.%m.%d %H:%M') File "/Users/macuser/downloads/yes/lib/python3.7/_strptime.py", line 577, in _strptime_datetime tt, fraction, gmtoff_fraction = _strptime(data_string, format) File "/Users/macuser/downloads/yes/lib/python3.7/_strptime.py", line 359, in _strptime (data_string, format)) ValueError: time data '"""2020.08.13 23:58' does not match format '%Y.%m.%d %H:%M'

該当のソースコード

python

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

txt

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

理想の出力結果

{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

1 output = '"""' + test + '"""' 23 output = test 4

この行の、testの前後につけている """ を除去するとうまくうごきました。

投稿2020/08/23 07:30

YakumoSaki

総合スコア2027

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

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

Male_soprano

2020/08/23 07:38

有難うございます.説明が足りず恐縮です. ご指摘の内容は承知の上で,テキストの内容を1行づつではなく丸ごと抽出したいので,下にコメントアウトで表記されているような三連引用符を付けたいと考えております. その上で尚,それ以降のコードをどう書き換えるか,と言う観点からアドバイスをいただけますと大変助かります.宜しくお願いします.
quickquip

2020/08/23 23:37

YakumoSaki さんの回答で「テキストの内容を1行づつではなく丸ごと抽出したい」は達成されています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問