PythonでJSON Linesを扱う
| key | value |
|---|---|
| Python | 3.8 or later |
| Last Update | 2020/09/06 |
こんにちは、yaml苦手っ子です。Python でJSON Linesを扱う方法を調べたのでまとめておきます。
JSON Lines とは
JSONを行区切りでファイルに書き込んだものです。
JSON Lines ここによると以下が条件みたいです.
Python での扱い方
ファイルから読んで、一行ごとにばらして json.load する感じです。
コードで書くとこんな感じです。
import json from typing import Any, Dict, Iterator, List, TextIO def filter_not_empty(list: List[str]) -> Iterator[str]: return filter(lambda x: len(x) > 0, list) # TODO: DictではなくTypedDictを使うと型ヒントの恩恵に預かれて便利 def parse_jsonl(fp: TextIO) -> List[Dict[str, Any]]: # fileが空行を含むことがあるので念の為フィルターする jlines = filter_not_empty(fp.read().splitlines()) result = [json.loads(jline) for jline in jlines] return result if __name__ == "__main__": with open("sample.jsonl", "r") as json_file: print(parse_jsonl(json_file))
jqコマンドの代わりにPythonでJSON Linesをpretty printする
Python 3.8から json.toolでもJSON Linesに対応しました。こんな感じでつかえます。
json --- JSON エンコーダおよびデコーダ — Python 3.8.5 ドキュメント
$ python3.8 -mjson.tool --json-lines sample.jsonl
{
"name": "Gilbert",
"wins": [
[
"straight",
"7\u2663"
],
[
"one pair",
"10\u2665"
]
]
}
{
"name": "Alexa",
"wins": [
[
"two pair",
"4\u2660"
],
[
"two pair",
"9\u2660"
]
]
}
{
"name": "May",
"wins": []
}
{
"name": "Deloise",
"wins": [
[
"three of a kind",
"5\u2663"
]
]
}
先人に感謝します。