Add your description here
Project description
Goodreads Normalizer
A Python library and command-line application for cleaning, validating, and normalizing Goodreads library exports.
Goodreads exports are an excellent way to back up your library, but the exported data is often inconsistent. Author names, series information, ISBNs, dates, shelves, and other metadata can vary significantly, making it difficult to analyse, migrate, or integrate with other cataloguing systems.
Goodreads Normalizer provides deterministic normalization using strongly typed Pydantic models, allowing your Goodreads data to be transformed into clean, validated, machine-readable records.
Features
- 📚 Read Goodreads CSV exports
- ✨ Normalize author names
- 👤 Validate author metadata
- 📝 Normalize editors, translators, and narrators
- 📖 Parse and normalize series information
- 🔢 Normalize ISBN values
- 📅 Consistent date handling
- 🗂 Typed Pydantic models
- 📄 Read and write CSV files
- 🖥 Command-line interface
- 🐍 Python library API
Why This Project?
Goodreads has existed for many years, and its export format reflects that history.
Some common issues include:
- inconsistent author names
- editors included as authors
- translators stored inconsistently
- multiple spellings of the same person
- incomplete or malformed series data
- inconsistent ISBN formatting
- missing or duplicated values
This project aims to normalize these inconsistencies while preserving the original information wherever possible.
The goal is predictable, repeatable normalization, not automatic guessing.
Installation
Using pip
pip install goodreads-normalizer
Using uv
uv add goodreads-normalizer
Command Line Usage
Normalize a Goodreads export:
goodreads-normalizer \
--file goodreads_export.csv \
--output normalized.csv
or
goodreads-normalizer -f goodreads_export.csv -o normalized.csv
Display help:
goodreads-normalizer --help
What Gets Normalized?
Current areas include:
- Author names
- Editors
- Translators
- Narrators
- Series names
- Series numbers
- ISBN values
- Empty values
- Date parsing
- Validation
The project deliberately avoids changing data that cannot be normalized with confidence.
Development
Clone the repository:
git clone https://github.com/Bas-Man/goodreads-normalizer.git
cd goodreads-normalizer
Install dependencies:
uv sync
To update documentation:
uv sync --group great-docs
uv run great-docs build
uv run great-docs preview
Run the test suite:
uv run pytest
Run linting:
uv run ruff check
Format the code:
uv run ruff format
Supported Python Versions
The project supports modern versions of Python.
See pyproject.toml for the current minimum supported version.
Project Goals
The project is designed to provide:
- deterministic normalization
- typed models
- reusable Python API
- command-line tooling
- validation of Goodreads data
- consistent output suitable for further processing
Roadmap
Future work includes:
- additional author normalization datasets
- improved editor and translator normalization
- additional export formats
Contributing
Bug reports, feature requests, and pull requests are welcome.
If you are planning a significant change, please open an issue first so the proposed approach can be discussed.
License
This project is licensed under the MIT License.
See the LICENSE file for details.
Acknowledgements
This project would not be possible without the availability of Goodreads library exports and the work of the open-source Python community.
Disclaimer
This project is an independent utility and is not affiliated with Goodreads or Amazon.
Users are responsible for ensuring they have the right to process any data used with this software.
License
MIT
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 goodreads_normalizer-0.1.0.tar.gz.
File metadata
- Download URL: goodreads_normalizer-0.1.0.tar.gz
- Upload date:
- Size: 212.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
58298b3aaaee071414e11b7db2897ec3d560274b35a7ac73b2261505a4e4143b
|
|
| MD5 |
2cb8c3fc328f10a34a28e827f6718d0e
|
|
| BLAKE2b-256 |
52628671b7c58b0693fe038f3413bccc5da61964e0b71530a51ef857380df1ca
|
File details
Details for the file goodreads_normalizer-0.1.0-py3-none-any.whl.
File metadata
- Download URL: goodreads_normalizer-0.1.0-py3-none-any.whl
- Upload date:
- Size: 24.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f123845a466bf3ea26f37a4fcce08a57345966f63bfe82a5b221fc0cb21fa3e8
|
|
| MD5 |
0cd6fa218dbaed900b6099833eef9c2d
|
|
| BLAKE2b-256 |
bdaed23bd17f51f2edda5b8c45603db3fc80d8e7c365d9a7ed794c4930bee9f8
|