Offline postal-code / geocode lookup — O(1) & O(log N) indexed, TB/ZB scale ready
Project description
zipfinder
Complete offline postal-code / geocode database for Python. Works 100 % offline no internet connection required.
Features
- 1.8 million records — 121 countries, worldwide postal-code dataset
- O(1) lookups — hash-indexed, constant time regardless of dataset size
- O(log N) prefix search — bisect-based, no full-table scans ever
- Spatial radius search — geo-grid index, O(C + K·log K)
- TB / ZB scale — optional SQLite mode for datasets that exceed RAM
- Zero dependencies — Python standard library only
- Fully embedded — all data ships inside the package
Installation
pip install zipfinder
Quick Start
from zip_finder import lookup_zip, lookup_all_zips, search_zip, find_nearby_zips
# Exact lookup O(1)
record = lookup_zip("94107", country="US")
print(record["city"]) # San Francisco
print(record["latitude"]) # 37.7647
# Lookup without country returns first match across all countries
record = lookup_zip("94107")
# All countries sharing the same code O(1)
all_matches = lookup_all_zips("94107")
for r in all_matches:
print(r["country_code"], r["city"])
# Prefix search by zip or city O(log N + K)
results = search_zip("Lon", country="GB", limit=5)
for r in results:
print(r["postal_code"], r["city"])
# Nearby zip codes by coordinates O(C + Klog K)
nearby = find_nearby_zips(37.7749, -122.4194, radius_km=10, limit=5)
for r in nearby:
print(r["city"], r["distance_km"], "km")
API Reference
| Function | Description | Time Complexity |
|---|---|---|
lookup_zip(code, country=None) |
Single zip lookup, returns one record or None |
O(1) |
lookup_all_zips(code, country=None) |
All records for a zip across countries | O(1) |
search_zip(query, country=None, limit=10) |
Prefix search by zip or city name | O(log N + K) |
find_nearby_zips(lat, lon, radius_km=10, limit=10) |
Radius search by coordinates | O(C + Klog K) |
get_db_stats() |
Total records and country count | O(1) |
list_countries() |
Sorted list of all ISO-3166 country codes | O(1) |
get_database(use_sqlite=False) |
Access the raw database singleton |
Record format
Every returned dict contains:
{
"postal_code": "94107",
"city": "San Francisco",
"state": "California",
"state_code": "CA",
"country_code": "US",
"latitude": 37.7647,
"longitude": -122.4194,
"accuracy": 4
}
Results from find_nearby_zips also include a "distance_km" field.
Advanced Usage
Database statistics
from zip_finder import get_db_stats, list_countries
stats = get_db_stats()
print(f"Records : {stats['total_records']:,}") # 1,826,607
print(f"Countries: {stats['countries']}") # 121
countries = list_countries()
print(countries[:5]) # ['AD', 'AE', 'AI', 'AL', 'AR']
TB / ZB scale SQLite mode
For datasets that exceed available RAM:
from zip_finder import get_database
db = get_database(use_sqlite=True)
record = db.lookup_zip("94107", country="US")
Function Name Reference
All function names and their descriptions:
| Function | Description | Time Complexity |
|---|---|---|
lookup_zip(code, country=None) |
Single zip lookup, returns one record or None |
O(1) |
lookup_all_zips(code, country=None) |
All records for a zip across countries | O(1) |
search_zip(query, country=None, limit=10) |
Prefix search by zip or city name | O(log N + K) |
find_nearby_zips(lat, lon, radius_km=10, limit=10) |
Radius search by coordinates | O(C + K\u00b7log K) |
get_db_stats() |
Total records and country count | O(1) |
list_countries() |
Sorted list of all ISO-3166 country codes | O(1) |
get_database(use_sqlite=False) |
Access the raw database singleton |
Contributing
- Fork https://github.com/karthikbd/zipfinder
- Create a branch:
git checkout -b feature/my-feature - Run tests:
python -m pytest tests/ -v - Push and open a Pull Request
License
Project details
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 zipfinder-2.0.1.tar.gz.
File metadata
- Download URL: zipfinder-2.0.1.tar.gz
- Upload date:
- Size: 58.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f84f8da861f4a2a3402f1a64b4c7f46f57b3c01df616643e862572bbd095ae85
|
|
| MD5 |
8a5530835e875272e7a3d320c4c4c281
|
|
| BLAKE2b-256 |
00515c45234066a32e05750a34585d373fbec6f17437cf476df241b68d940641
|
File details
Details for the file zipfinder-2.0.1-py3-none-any.whl.
File metadata
- Download URL: zipfinder-2.0.1-py3-none-any.whl
- Upload date:
- Size: 58.9 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd4862eaca3046ec03471d61b4b75ecbdb8e67e035070bee366fb36349015a79
|
|
| MD5 |
62aa7216fd35d8dc21ebc6539b43a6c7
|
|
| BLAKE2b-256 |
18bcfc8de64c10fa0e792fb0ec889cd924707135445447e888c01a096ffccd46
|