A lightweight Python library for handling jsonlines files.
Project description
jsonl
A lightweight, dependency-free Python library for JSON Lines — read, write, compress, and stream with ease.
Documentation · Changelog · Issues
jsonl provides a simple, Pythonic API for working with JSON Lines data.
It follows the conventions of Python's standard json module — if you know json.dump and json.load,
you already know how to use jsonl.
Fully compliant with the jsonlines and ndjson specifications.
Features
| Feature | Description |
|---|---|
| 🌎 Familiar API | Interface similar to the standard json module (dump, load, dumps) |
| ⚡ Streaming by default | Read and write incrementally via iterators, keeping memory usage low |
| 🗜️ Built-in compression | Transparent support for gzip, bzip2, and xz |
| 📦 Archive support | Read and write ZIP and TAR archives (.tar.gz, .tar.bz2, .tar.xz) |
| 📥 Load from URLs | Pass a URL directly to load() or load_archive() |
| 🚀 Pluggable serialization | Swap in orjson, or any JSON library |
| 🔧 Error tolerance | Optionally skip malformed lines instead of crashing |
| 🐍 Zero dependencies | Uses only the Python standard library — nothing else |
Installation
pip install py-jsonl
Requires Python 3.8+. No external dependencies.
Quick Start
Write
import jsonl
data = [
{"name": "Gilbert", "wins": [["straight", "7♣"], ["one pair", "10♥"]]},
{"name": "May", "wins": []},
]
jsonl.dump(data, "players.jsonl")
Read
import jsonl
for item in jsonl.load("players.jsonl"):
print(item)
Read from a URL
import jsonl
for item in jsonl.load("https://example.com/data.jsonl"):
print(item)
Compressed files
The compression format is determined automatically — by file extension when writing, and by magic numbers when reading:
import jsonl
data = [{"key": "value"}]
jsonl.dump(data, "file.jsonl.gz") # gzip
jsonl.dump(data, "file.jsonl.bz2") # bzip2
jsonl.dump(data, "file.jsonl.xz") # xz
for item in jsonl.load("file.jsonl.gz"):
print(item)
Archives (ZIP / TAR)
import jsonl
# Write multiple files into an archive
data = [
("users.jsonl", [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}]),
("orders.jsonl", [{"id": 1, "total": 99.90}, {"id": 2, "total": 45.00}]),
]
jsonl.dump_archive("data.tar.gz", data)
# Read them back
for filename, items in jsonl.load_archive("data.tar.gz"):
print(f"--- {filename} ---")
for item in items:
print(item)
Multiple output files
import jsonl
data = [
("file1.jsonl", [{"name": "Alice"}, {"name": "Bob"}]),
("file2.jsonl", [{"name": "Charlie"}]),
("file1.jsonl", [{"name": "Eve"}]), # appended to file1.jsonl
]
jsonl.dump_fork(data)
API Overview
Reading
| Function | Description |
|---|---|
jsonl.load(source, **kw) |
Read from a file, URL, or file-like object |
jsonl.load_archive(file, **kw) |
Unpack JSON Lines files from a ZIP or TAR archive |
jsonl.loader(stream, broken, **kw) |
Low-level generator deserializing a line stream |
[!TIP] All read functions accept
json_loadsand**json_loads_kwargsfor custom deserialization.
Writing
| Function | Description |
|---|---|
jsonl.dump(iterable, file, **kw) |
Write objects to a JSON Lines file |
jsonl.dumps(iterable, **kw) |
Serialize to a JSON Lines string |
jsonl.dump_fork(paths, **kw) |
Write to multiple JSON Lines files at once |
jsonl.dump_archive(path, data, **kw) |
Pack multiple JSON Lines files into a ZIP or TAR archive |
jsonl.dumper(iterable, **kw) |
Low-level generator yielding formatted lines |
[!TIP] All write functions accept
json_dumpsand**json_dumps_kwargsfor custom serialization.
For complete parameter documentation, see the full docs →
Custom Serialization
Plug in any JSON-compatible serializer. For example, orjson
for high-performance encoding:
import orjson # ensure orjson is installed: pip install orjson
import jsonl
data = [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}]
# Write with orjson (returns bytes → set text_mode=False)
jsonl.dump(data, "fast.jsonl", json_dumps=orjson.dumps, text_mode=False)
# Read with orjson
for item in jsonl.load("fast.jsonl", json_loads=orjson.loads):
print(item)
Extra keyword arguments are forwarded to the underlying serializer:
import jsonl
data = [{"name": "Alice", "score": 9.5}, {"name": "Bob", "score": 7.2}]
jsonl.dump(data, "compact.jsonl", separators=(",", ":")) # compact output
jsonl.dump(data, "sorted.jsonl", sort_keys=True) # deterministic keys
Supported Formats
| Type | Extensions |
|---|---|
| Plain | .jsonl |
| Compressed | .jsonl.gz, .jsonl.bz2, .jsonl.xz |
| ZIP archive | .zip |
| TAR archive | .tar, .tar.gz, .tar.bz2, .tar.xz |
When reading, if the file extension is not recognized, jsonl falls back to magic-number detection to identify the compression format automatically.
Contributing
# Install dev dependencies
pip install --group=test --upgrade
# Run tests
python -m pytest tests/
python -m pytest tests/ --cov # run with coverage reporting
# Lint
pip install --group=lint --upgrade
ruff check .
# Docs
pip install --group=doc --upgrade
# zensical usage: https://zensical.org/docs/usage/
zensical build
zensical serve
License
MIT — see LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file py_jsonl-1.3.24.tar.gz.
File metadata
- Download URL: py_jsonl-1.3.24.tar.gz
- Upload date:
- Size: 18.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
137c2f63cdbebfb1736cdb7bbf32a01da5c7c3e2d6959776f62faf00187b05c5
|
|
| MD5 |
07fcdbced2d5cf762f04d3cb1e7d1725
|
|
| BLAKE2b-256 |
735616e49151fe33ea7ec8946d0251a4359809cbc77f0d96ff012d3466576e4e
|
File details
Details for the file py_jsonl-1.3.24-py3-none-any.whl.
File metadata
- Download URL: py_jsonl-1.3.24-py3-none-any.whl
- Upload date:
- Size: 10.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
498c7485d243a0948a462d77d9d5c4b85ea637860a898f648deb3ea18b16acf6
|
|
| MD5 |
abea292a02ef87b67cd8c0ae2c088cef
|
|
| BLAKE2b-256 |
6129fb13f5c5b292b90fedc88ffe0b212cc30b3892d62063b4a52b687234c829
|