LoginSignup
230
230

More than 5 years have passed since last update.

JSONって書いてあるのにJSONじゃない形式のデータを内閣官房なる組織が公開していたから、pythonでJSON形式のデータの保存する方法をまとめる

Last updated at Posted at 2016-08-20

(【追記】コメントにあるようにgc373さんのご協力で、問題のデータはJSONとして修正されています。)
データは大切です。優れたデータは社会によい価値を提供するでしょう。優れたデータというのは、価値の高い情報を持っているだけでなく、それが扱いやすいということも大切でしょう。扱いやすいというのは、データに簡単にアクセスでき、そのデータを容易に読み込めるということでしょう。特別なソフトウェア用の形式であったり、余計なものが書かれていて読む前に人間が読まないといけないというのは扱いづらいと言えるでしょう。SHIFT_JISなのも困りものです。

とはいえ、まずはデータがあって初めて何かができるわけで、オープンデータとして、政府がデータを公開し始めているのは評価すべきことのはずです。しかし、どのような状態のデータを公開すると良いのかについてはノウハウが不十分におもわれます。

さて、http://www.data.go.jp/というサイトがあり、無数のデータが手に入るようです。きっと、我が国を良くすることができるデータが埋もれているに違いありません。・・・と期待をして、ちょっと触ってみました。とりあえず、メタデータ一覧2016年7月分というのが目に入ったので、どんなことが書いてあるのか気になったので、JSONのものをダウンロードしました。

import json
text = "".join(open("hoge.json").readlines())
data = json.loads(text)

のようにすれば、読み込めるでしょう。そのはずでした。しかし、上手く行かないわけです。仕方がないので、ファイルをちょっと覗いてみました。すると、なんということでしょう。

[{u'license_title': None, u'maintainer': None, ・・・

JSONはjavascriptの形式に沿ったデータです。しかし、javascriptにはNoneなんてものはありません。u'hoge'のような文法もありません。ええ、これはJSONではないのです。

むしろ、Noneとかはpythonでしょう。ひょっとするとこれはpythonのデータをjsonに変換することなく出力してしまったのではないかという疑惑が起きてきました。ということで、危険を顧みず、

data = eval(text)

してみたところ、データがエラーなく読み込めるではないですか。もちろん、この方法はとても危険です。悪意のある部分が含まれていたらひとたまりもないでしょう。政府が出しているデータだから大丈夫と言っていいものでもないですが、何かあったら政府のせいにすることにして実行しました。よい子は真似してはいけません。実際、CPUの使用率は100%になり、16Gのメモリも使いきるという状況になりました。

さて、せっかく読み込めたデータを今度こそJSONで保存しましょう。

with open("out.json", "w") as f:
    f.write(json.dumps(data))

これで無事jsonとして保存できました。めでたしめでたし。

これで終わって、意見受付のところにでも、間違ったデータだと文句をつけておこうかと思ったのですが、意見受付のリンクを踏むと「安全な接続ではありません」となって修正の要求もできない。ということでここにこんなことを書いたと。

どこかにイキのいいデータは落ちてないものか・・・

230
230
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
230
230