🧾 CleanDB
A Lightweight Data Cleaning and Quality Solution for Text-Based Structured Data
CleanDB is a Python-native, zero-dependency utility for managing structured .txt files. Perfect when full database integration is overkill using simple 1D/2D list logic.
Ideal for microservices, pipelines, automation scripts, bots, or lightweight data auditing.
📦 Features
- ✅ Structured Data Enforcement (1D or 2D)
- ✍️ Write, Read, Append, and Delete with built-in validation
- 🔍 SQL-style read filtering by column index
- 🧹 Selective delete, file trimming, and cleanup
- 🎗️ Multi-console safe (handles concurrent access)
- 💾 Manual backups and timed snapshots
- 🧪 Debug tool with auto-fix for invalid rows
- 🗂️ Organized folder structure with versioned files
- 🔐 File hiding/unhiding with access controls
- 🗃️ Zero external dependencies
- 💪 Tamper-resistant and structure-locked
⚙️ Installation
pip install cleandb
♻️ Upgrade
pip install --upgrade cleandb
🚀 Quick Start
import cleandb as db
db.w("tasks", [["Read", "Done"], ["Code", "Pending"]])
db.a("tasks", [["Test", "Pending"]])
print(db.r("tasks"))
db.d("tasks", del_list=["Done"], index=1)
db.backup("tasks")
db.snapshot("tasks", unit="h", gap=6)
🧰 Function Overview
🔄 Write
w(txt_name, write_list, is2d=None)
- Overwrites file content with a validated structure.
- Use
is2d=Truefor 2D data,Falsefor 1D. - Use
[]to reset file and structure lock.
📖 Read
r(txt_name, index=None, set_new=[], notify_new=True)
- Reads file contents.
- Optional filtering using index (single or list).
- If file doesn’t exist, creates and returns
set_new.
➕ Append
a(txt_name, append_list, is2d=None)
- Appends rows to the file.
- Must match existing structure.
is2drequired if appending to a new file.
❌ Delete
d(txt_name, del_list=[], index=None, cutoff=None, keep=None, reverse=False, size=None)
-
Deletes matching rows using flexible criteria:
index: single, list, or"*"(match entire row)cutoff: max deletions per valuekeep: retain only N matchesreverse: delete from endsize: trim file to last N rows
💾 Backup
backup(txt_name, display=True)
- Manual backup of a file.
- Use
*to back up all files.
⏱ Snapshot
snapshot(txt_name, unit, gap, trim=None, begin=0, display=True)
- Time-based snapshot after
gapduration. - Units:
's','m','h','d','mo','y'
🧹 Debug
debug(txt_name, is2d=None, length=None, display=True)
- Finds structural issues (e.g., wrong row lengths).
🧨 Remove File
remove(txt_name, display=True)
- Deletes file and all its backups.
🙈 Hide / Unhide
hide(txt_name, display=True)
unhide(txt_name, display=True)
- Hide or unhide files.
- Use
*for all files.
📋 List Files
listdir(display=True)
- Lists all stored file names.
ℹ️ File Info
info(txt_name, display=True)
describe(txt_name, display=True)
- Shows metadata: type, shape, row count, etc.
👉 1D List Example
# Create a 1D file
db.w("shopping_list", ["Apples", "Bread", "Milk"], is2d=False)
# is2d=False is a must only for 1D list on first write / append or after a validation reset.
# Append a new item
db.a("shopping_list", ["Eggs"])
# Read all items
print(db.r("shopping_list")) # ['Apples', 'Bread', 'Milk', 'Eggs']
print(db.r("shopping_list", index=1)) # 'Bread'
# Delete items
db.d("shopping_list", "Milk")
db.d("shopping_list", ["Bread", "Eggs"])
👉 2D List Example
tasks = [
["Read Docs", "Done", "Low"],
["Fix Bug", "Pending", "High"],
["Write Tests", "Pending", "Medium"],
["Deploy", "In Progress", "High"],
["Fix Bug", "Done", "Low"]
]
db.w("task_board", tasks)
🧹 Delete Workflow (Structured & Clear)
1️⃣ Delete rows where Priority is "Low"
db.d("task_board", del_list=["Low"], index=2)
2️⃣ Delete an exact row
db.d("task_board", del_list=[["Fix Bug", "Pending", "High"]], index="*")
3️⃣ Delete by partial match on Task
db.d("task_board", del_list=[["Deploy"], ["Write Tests"]], index=0)
4️⃣ Delete rows where Status = "Done" and Priority = "High"
db.d("task_board", del_list=[["Done", "High"]], index=[1, 2])
5️⃣ Trim file to last 2 rows
db.d("task_board", size=2)
6️⃣ Clean invalid rows
db.debug("task_board", is2d=True, length=3)
💾 Backup & Snapshot
db.backup("task_board")
db.snapshot("task_board", unit="h", gap=6, trim=10)
🧪 Advanced Delete: cutoff, keep, size
tasks = [
["Read Docs", "Done"],
["Fix Bug", "Pending"],
["Write Tests", "Pending"],
["Deploy", "Pending"],
["Fix Bug", "Done"],
["Write Tests", "Done"],
["Fix Bug", "Pending"],
["Deploy", "Done"]
]
db.w("task_board", tasks)
# 1️⃣ Delete up to 2 rows where Status == "Pending"
db.d("task_board", del_list=["Pending"], index=1, cutoff=2)
# 2️⃣ Keep only 1 "Fix Bug" row
db.d("task_board", del_list=["Fix Bug"], index=0, keep=1)
# 3️⃣ Keep only last 4 rows
db.d("task_board", size=4)
📂 Backup & Recovery
- 🔄 Backups are stored in:
Backup 💾/ - 📸 Snapshots are stored in:
Snapshot 📸/ - 🔁 Restore: Just copy desired file back to the main data directory.
🧠 Notes
- Structure Locking: On first write/append, shape (1D/2D) and length are saved.
- Use
w("file", [])to reset structure. - Only list data is supported.
- All operations auto-sync with backups.
🛡 Best Practices
- Always use CleanDB methods (
w(),a(),d(), etc.). - Avoid manual file edits — validation will fail.
- Use
debug()when operations fail unexpectedly. - Automate
snapshot()for long-running apps.
📜 License
This project is free to use, modify, and distribute. No warranties are provided.
🙋 Contribution
Pull requests, issues, and forks are welcome!
Metadata
Release files for cleandb 5.0.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| cleandb-5.0.3.tar.gz | 43.1 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cleandb-5.0.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 87.3 kB
Release files / cleandb-5.0.3.tar.gz
| Download URL | cleandb-5.0.3.tar.gz |
|---|---|
| Size | 43.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
351e29b59cb1e14d37b0dfd66c96a5787e2f085d3e75e974789c3d7d5d02d66d
|
|
BLAKE2b-256 checksum How to use checksums |
cdc24dde9e8c1f2481e5b520806018683b2742669e8011126e25b956ded08ffd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.7
|
Release files / cleandb-5.0.3-py3-none-any.whl
| Download URL | cleandb-5.0.3-py3-none-any.whl |
|---|---|
| Size | 44.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ee65938bea566966ad19d69f8b665e4b7ea095f21a4c511503704eb692a6d16d
|
|
BLAKE2b-256 checksum How to use checksums |
6f0c53907abce4d1c2cfb6d97ac4e3ca317b8f604a485e02a6badc64135e820a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.7
|
Security for cleandb 5.0.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.