Library / SDK
jazzband/tablib avatar
jazzband/tablib

tablib: one Dataset object, twelve output formats, no format lock-in

Python Module for Tabular Datasets in XLS, CSV, JSON, YAML, &c.

4,757 stars621 forksPythonMIT

At a glance

What is it?
A format-agnostic tabular dataset library for Python that treats Excel, JSON, YAML, CSV and the rest as serialization targets rather than as the shape of your data.
Who is it for?
Tablib's bet is that a row of data should not have a format attached to it. That sounds obvious, yet most Python table libraries make you pick a format at the moment you create the object, and then you are rewriting code when a customer asks for CSV instead of XLSX.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 25 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A library whose central idea is what it refuses to do

The README opens by calling Tablib a format-agnostic tabular dataset library written in Python, and then spends most of its length on a list of output formats: Excel, JSON, YAML, Pandas DataFrames, HTML, Jira, LaTeX, TSV, ODS, CSV, DBF and SQL. Excel, JSON and YAML are marked as supporting both Sets and Books. The rest are Sets only.

Those two words are Tablib's whole data model. A Dataset is a single table with a header row and rows of values. A Databook is a collection of named Datasets, which is how multi-sheet Excel files and grouped JSON objects map onto the library.

Then there is the exclusion. The README says Tablib purposefully excludes XML support, that it always will, and immediately adds that this is a joke and pull requests are welcome. It is a small joke, but it is doing real work as a statement of intent. XML is the format every table library adds out of obligation, and the fact that this one will not is the clearest possible signal about which formats the maintainers actually care about.

Everything else in the README is housekeeping: badges for the Jazzband collective, the PyPI version, supported Python versions, monthly downloads, GitHub Actions, codecov, and the MIT license. Documentation lives at tablib.readthedocs.io, is also shipped in the `docs` directory of the source distribution, and there is a contributing guide under `.github`.

The packaging tells you which formats cost what

Everything a Tablib user needs to know about dependencies is in `pyproject.toml`, because each format is gated behind its own extra. The `all` extra is the union of the rest.

toml
all = [
    "odfpy",
    "openpyxl>=2.6.0",
    "pandas",
    "pyyaml",
    "tabulate",
    "xlrd",
    "xlwt",
]

Read that list as an answer to a question the README does not ask. ODS needs odfpy. XLSX needs openpyxl. Pandas output needs pandas. YAML needs pyyaml. The CLI extra pulls in tabulate. And legacy XLS needs both xlrd and xlwt, which is the shape of a format that predates modern packaging and needs a reader and a writer.

The narrower extras are the ones you will actually install: `html` is an empty list because the HTML target has no third-party dependency, `xlsx` and `ods` and `yaml` and `pandas` are each a single package, and `xls` is the pair.

The rest of the project metadata is unremarkable in the way well-run packaging usually is. Python 3.10 is the floor, with classifiers running through 3.15. Development status is declared as Production/Stable. The version is dynamic, written by setuptools_scm into `src/tablib/_version.py` at build time, so releases come from tags. The author is listed as Kenneth Reitz, and the maintainer list is the Jazzband Team, Hugo van Kemenade and Claude Paroz, which is a good illustration of how maintainership in these projects is distributed rather than held by one person. Ruff handles linting with a line length of 99.

Version 3.10.0 fixed an HTML escaping issue and moved to Python 3.15

The most recent release, 3.10.0 on 2026-07-31, leads with a security note rather than a feature: dataset titles are now escaped during HTML serialization. A dataset title is user-controlled text often enough, and HTML output is often fed straight into an email template or a report, so an unescaped title is a straightforward injection path. If you generate HTML from Tablib and are below 3.10.0, this is the release to upgrade to.

The same release adds Python 3.15 support, and pairs it with lazy imports on 3.15 to improve startup speed. Those two changes together are the shape of a project getting ready for a new interpreter before most of its ecosystem is. It also drops Python 3.9, which is why `pyproject.toml` says 3.10 is the floor.

Three fixes in the same release are the kind of detail that only shows up with a real user base. Converting XLS cell values when importing a Databook, a TypeError when stacking two headerless Datasets with `stack_cols`, and an ODS export of boolean values that crashed on re-import. The boolean one is the kind of bug that only appears in a full round trip, which is the reason the test suite has to import what it exports.

There is also a small tidy-up: the generic error message URL no longer carries a `#yaml` tag, presumably because the message is shared across formats and the anchor was misleading.

Version 3.9.0, published 2025-10-15, added the SQL export format, which is the newest addition to that format list, along with column width support for xlsx Databook exports and a dataset title adjustment for the xls format. It also added Python 3.14 support. Version 3.8.0 came on 2025-01-22.

What a project of this size looks like day to day

The repository is MIT licensed with 4,757 stars, 621 forks and 58 open issues, and the last push was on 2026-09-11. That issue count is low for a library this widely used, which usually means either the maintainers close things quickly or the common questions are answered by the documentation instead.

The tree is compact and says something about the project's priorities: `src/` for the code, `tests/` alongside it, `docs/` for the Read the Docs sources, `pyproject.toml`, `pytest.ini` and `tox.ini` for testing across versions, `.pre-commit-config.yaml` and a `.coveragerc` for the quality gates, plus `HISTORY.md`, `RELEASING.md`, `AUTHORS`, `CODE_OF_CONDUCT.md` and `LICENSE`. A dedicated `RELEASING.md` in a library with this many contributors usually means releases are a shared responsibility rather than one person's job.

The releases themselves look like they are written for users rather than for a changelog page. Version 3.8.0 credits two pull requests by author name, including one first-time contributor, and the language is plain: add support for column_width in xlsx format, remove a redundant check from `Dataset.load()`. That is a maintainer describing a diff they actually read.

The one thing a new user will notice quickly is how little the README explains about usage. It is a signpost, not a tutorial. The actual API documentation is on the documentation site and in the `docs` directory, and the PyPI page is linked as the place to get the package.

Editorial conclusion

Tablib's bet is that a row of data should not have a format attached to it. That sounds obvious, yet most Python table libraries make you pick a format at the moment you create the object, and then you are rewriting code when a customer asks for CSV instead of XLSX. Holding the data in a plain Dataset and serializing on demand costs you one extra method call and saves the rewrite. The cost is that the optional dependencies are real: `pip install tablib` gives you the core, and pandas, openpyxl, odfpy and the xlrd and xlwt pair each gate a format behind an extra. Install `all` if you are not sure yet. With 4,757 stars, 621 forks, 58 open issues and a push on 2026-09-11, this is a settled library rather than a fast-moving one, and the 3.10.0 security fix in July 2026 is a good reason to check your version before you ship.

Frequently asked questions

How do I install Tablib?

The README points to the PyPI project page rather than spelling out a command, and the format support you get depends on the extra you choose. `all` installs odfpy, openpyxl, pandas, pyyaml, tabulate, xlrd and xlwt, which covers every format in the list. Individual extras exist for ods, xlsx, yaml, pandas, xls, html and cli.

What formats can tablib export?

Excel, JSON, YAML, Pandas DataFrames, HTML, Jira, LaTeX, TSV, ODS, CSV, DBF and SQL. Excel, JSON and YAML support both Sets and Books; the others are Sets only. XML is deliberately unsupported, which the README describes as a standing joke.

What is the difference between a Dataset and a Databook in tablib?

A Dataset is a single table with a header row and data rows. A Databook is a collection of named Datasets, which maps onto multi-sheet Excel files and grouped JSON objects. Excel, JSON and YAML can serialize both; the remaining formats only handle a single Dataset.

Which Python versions does tablib support?

Python 3.10 is the floor, with classifiers running through 3.15. Version 3.10.0 added Python 3.15 support and dropped Python 3.9, and version 3.9.0 added Python 3.14 support.

What security fix shipped in tablib 3.10.0?

Dataset titles are now escaped during HTML serialization, which closes an injection path when a title is user-controlled and the HTML output lands in an email or report. Version 3.10.0 was published on 2026-07-31.

Official sources

  1. jazzband/tablib on GitHub
  2. License: MIT
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/jazzband-tablib.svg)](https://hysenlabs.com/projects/jazzband-tablib)