Bus errorとSegmentation faultに困ったら見るブログ

物理の研究者による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)

【python3】JSONを読み書きしたい

pythonで解析をして、それのログファイルを残したい
単純なログファイルなら、必要な情報を書いてテキストファイルにしておけば良い

今回はそのログファイルをwebページ(html+javascript)で読み込んで、ページに要素として並べたい

なので、ログファイルの形式はcsvjsonか、または直接javascriptの形式にして書き出すかに絞られる
csvpythonで入出力の関数がそれなりに用意されているので簡単な気がするが、
今回はjson形式で読み書きすることにする

pythonでのjson形式の読み書きのほぼ全ては以下のページにまとめられている
とりあえずこれを上から読んで実行していけばOK


PythonでJSONファイル・文字列の読み込み・書き込み | note.nkmk.me

それをpythonコードに直したのが以下
(該当箇所だけ抜き出してる)

import json
from datetime import datetime, timedelta

(略)

JST_beg = UTC_beg+ timedelta(hours=+9)
JST_end = UTC_end + timedelta(hours=+9)
today = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

# 空の辞書型を作成
# dfに既存のjsonファイルを開く、dnewにdfの先頭15個と最新の結果をまとめる
df = {}
dnew = {}

# json_fnameはPATH+出力ファイル名
json_fname = outdir + "log.json"

# 既存のjsonファイルを開いてdfに代入
with open(json_fname, 'r') as file:
 try:
  df = json.load(file)
  #print(df)
  file.close()
 except Exception as e:
  print(e)

# 既存のjsonの最新から15件のみ残す
# 「Python3.6までは言語仕様として辞書(dict型オブジェクト)は要素の順序を保持していない」
# と↑の記事にあったが、今使ってるpythonは3.7なので今は気にしなくて良い
# keyは実行時の日付+時間が入っているのでそれで逆順にソートすれば最新のものから取得可
dfkeys = sorted(df.keys(), reverse=True)[0:15]

# 辞書型の要素のうち一番最新の要素のindexを取り出して、そこから今加える最新の結果のindexを作る
# ここでindexは通し番号相当
index = df[dfkeys[0]]["index"] + 1 # compute the current index

# 古い辞書型に新しい要素を加えると、一番うしろに入ると思ったので
# 別の辞書を用意してそれの先頭に要素を加える
dnew["%s" % today] = { "index": index,
 "date_beg" : "%d-%02d-%02d" % (JST_beg.year, JST_beg.month, JST_beg.day),
 "hour_beg" : JST_beg.hour,
 "minute_beg" : "%d" % JST_beg.minute,
 "second_beg" : "%d" % JST_beg.second,
 "date_end" : "%d-%02d-%02d" % (JST_end.year, JST_end.month, JST_end.day),
 "hour_end" : "%d" % JST_end.hour,
 "minute_end" : "%d" % JST_end.minute,
 "second_end" : "%d" % JST_end.second,
 "gps_beg" : start_gpstime,
 "gps_end" : end_gpstime
}

# 新しい辞書の後ろに、既存の辞書型を加える
for key in dfkeys:
 dnew[key] = df[key]

# 最後に最初に読み込んだ既存のjsonファイルと同名でファイルを開いて、そこに出力する
# 要するに上書き保存
with open(json_fname, 'w') as file:
 json.dump(dnew, file, indent=2)
 file.close()

道中で使った辞書のkey(リストと考えて良い)の並び替えについて

sort()は破壊的(すでにあるリストの順番を書き換えてしまう)
sorted()は非破壊的(並び替えたリストを返す)

Pythonの辞書のリストを並び替える #sort - Qiita