JSON Lines
На днях оценил формат JSON Lines. Это такой CSV на стероидах:
- каждая запись идет отдельной строкой, как в CSV;
- но при этом представляет собой полноценный JSON.
Например:
{ "id":11, "name":"Diane", "city":"London", "department":"hr", "salary":70 }
{ "id":12, "name":"Bob", "city":"London", "department":"hr", "salary":78 }
{ "id":21, "name":"Emma", "city":"London", "department":"it", "salary":84 }
{ "id":22, "name":"Grace", "city":"Berlin", "department":"it", "salary":90}
{ "id":23, "name":"Henry", "city":"London", "department":"it", "salary":104}
Классная штука:
- Подходит для объектов сложной структуры (в отличие от csv);
- Легко потоково читать, не загружая файл целиком в память (в отличие от json);
- Легко дописывать новые записи к существующему файлу (в отличие от json).
JSON, в принципе, тоже можно читать потоково. Но посмотрите, насколько это проще с JSON Lines:
import json
from typing import Iterator
def jl_reader(fname: str) -> Iterator[dict]:
with open(fname) as file:
for line in file:
obj = json.loads(line.strip())
yield obj
if __name__ == "__main__":
reader = jl_reader("employees.jl")
for employee in reader:
id = employee["id"]
name = employee["name"]
dept = employee["department"]
print(f"#{id} - {name} ({dept})")
#11 - Diane (hr)
#12 - Bob (hr)
#21 - Emma (it)
#22 - Grace (it)
#23 - Henry (it)
Идеально для логов и конвейеров обработки данных.
★ Подписывайтесь на новые заметки.