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

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

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

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

Python 3.x

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

Python

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

Q&A

解決済

3回答

9757閲覧

jsonが複数行あるファイルをpythonで取り扱いたい

mrr

総合スコア36

JSON

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/09/14 08:45

前提・実現したいこと

sample.jsonというファイルに以下のようなフォーマットでデータが入っています

json

1{"key1": "value1","key2":"value2"} 2{"key1": "value3","key2":"value4"} 3{"key1": "value5","key2":"value6"} 4         : 5         :

こういった場合、各行の"key1"を取得したいです。

試したこと

各行をjson.loadしてjsonとして取得したいです(まだできていませんが)

python

1f = open('./sample.json', 'r') 2line = f.readline() 3 4while line: 5 print(line["key1"]) 6 line = f.readline() 7f.close

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

TypeError: string indices must be integers

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

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

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

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

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

guest

回答3

0

当該ファイルをjson形式だと呼んで良いのかがそもそも疑問ですが、
単に一行ずつ json.loads すれば要件は満たされるのではないでしょうか。

Python

1import json 2 3with open('sample.json') as fin: 4 for line in fin: 5 data = json.loads(line) 6 print(data['key1'])

実行結果 Wandbox

value1 value3 value5

投稿2018/09/14 08:51

LouiS0616

総合スコア35660

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

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

0

sample.json の内容を json.load で扱えるように 変換したファイルをつくり、
それを json.load で読み込んで print させてみました。

python3

1import json 2 3fake_json_path = "sample.json" 4json_path = "work.json" 5 6with open(json_path, "w") as fout: 7 fout.write("[\n ") 8 with open(fake_json_path) as fin: 9 fout.write(' ,'.join(fin.readlines())) 10 fout.write("]\n") 11 12data = {} 13with open(json_path) as fin: 14 data = json.load(fin) 15 16for row in data: 17 print(row["key1"])

上のコードでは 新たに作成される work.json 内容は次のようになります。

json

1[ 2 {"key1": "value1","key2": "value2"} 3 ,{"key1": "value3","key2": "value4"} 4 ,{"key1": "value5","key2": "value6"} 5]

投稿2018/09/14 15:37

katoy

総合スコア22324

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

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

0

ベストアンサー

そのlineはただの文字列です。

標準モジュールのjson.loads()あたりを使って文字列をpythonのオブジェクトに変換してください。

19.2. json — JSON エンコーダおよびデコーダ — Python 3.6.5 ドキュメント

投稿2018/09/14 08:49

hayataka2049

総合スコア30933

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

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

mrr

2018/09/14 08:52

動きました。ありがとうございます。
hayataka2049

2018/09/14 08:53

複数行のJSONは絶対ないと言い切れる仕様なんだよね・・・?
mrr

2018/09/14 08:55

はい。絶対にありません。
hayataka2049

2018/09/14 08:59

それならまあ、普通はJSONの配列に入れたりすると思いますが、勝手にそういうフォーマットを定義して使うのは自由です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問