Chars counter console util
Project description
chars-counter
A Python utility that counts, per ASCII category, how many characters appear exactly once in a given string. Works as both a CLI tool and an importable library.
Requires Python ≥ 3.14
Installation
pip install chars-counter
uv add chars-counter
CLI usage
Run the module directly with python -m chars_counter.
Count characters in a string
python -m chars_counter --string "Hello"
# Counter({<ASCIICharCategories.Lowercase_Letters: 'lowercase_letters'>: 2, <ASCIICharCategories.Uppercase_Letters: 'uppercase_letters'>: 1})
H appears once → 1 uppercase. e and o each appear once → 2 lowercase. l appears twice → ignored.
Count characters from a file
python -m chars_counter --file path/to/file.txt
Help
python -m chars_counter --help
Typo suggestions
Mistyped flags are caught and the closest valid flag is suggested:
python -m chars_counter --flie notes.txt
# --flie cannot be used, maybe you meant: --file
Library usage
Basic example
from chars_counter import get_once_seen_chars_categories_count, ASCIICharCategories
result = get_once_seen_chars_categories_count("Hello")
# Counter({<ASCIICharCategories.Lowercase_Letters: 'lowercase_letters'>: 2,
# <ASCIICharCategories.Uppercase_Letters: 'uppercase_letters'>: 1})
result[ASCIICharCategories.Lowercase_Letters] # 2
result[ASCIICharCategories.Uppercase_Letters] # 1
Iterating over results
from chars_counter import get_once_seen_chars_categories_count
result = get_once_seen_chars_categories_count("aA1")
for category, count in result.items():
print(f"{category}: {count}")
# lowercase_letters: 1
# uppercase_letters: 1
# digits: 1
Empty / all-duplicate strings
Strings where every character appears more than once return an empty dict:
get_once_seen_chars_categories_count("aabb") # Counter()
get_once_seen_chars_categories_count("") # Counter()
Handling non-ASCII input
Passing a string that contains non-ASCII characters raises NotAsciiCharacterProvidedError:
from chars_counter import get_once_seen_chars_categories_count
from chars_counter.not_ascii_character_provided_error import NotAsciiCharacterProvidedError
try:
get_once_seen_chars_categories_count("café")
except NotAsciiCharacterProvidedError as e:
print(e.char) # 'é'
print(e.position) # 3
print(e) # Non-ASCII character 'é' found at position 3.
ASCII character categories
| Category | Code points | Examples |
|---|---|---|
Control_Characters |
0–31, 127 | \t, \n |
Space |
32 | |
Punctuation |
33–47, 58–64, 91–96, 123–126 | !, ., @ |
Digits |
48–57 | 0–9 |
Uppercase_Letters |
65–90 | A–Z |
Lowercase_Letters |
97–122 | a–z |
Public API reference
get_once_seen_chars_categories_count(string: str) -> dict[ASCIICharCategories, int]
Returns a Counter mapping each ASCIICharCategories member to the number of characters in that category that appear exactly once in string. Categories with no once-seen characters are omitted.
Results are cached (lru_cache, capacity 1000).
Raises NotAsciiCharacterProvidedError if string contains any non-ASCII character.
ASCIICharCategories
A StrEnum with members: Control_Characters, Space, Punctuation, Digits, Uppercase_Letters, Lowercase_Letters.
Each member's string value is its snake_case name (e.g. ASCIICharCategories.Lowercase_Letters == "lowercase_letters").
NotAsciiCharacterProvidedError
Inherits from Exception. Attributes:
char: str— the offending characterposition: int— its index in the input string
Development
uv sync
uv run pytest
uv run coverage run -m pytest && uv run coverage report
uv run ruff format
uv run ruff check --fix
uv run pyright
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 chars_counter-0.4.0.tar.gz.
File metadata
- Download URL: chars_counter-0.4.0.tar.gz
- Upload date:
- Size: 4.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"20.1","id":"ulyssa","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 |
d2dfa6bc2e4d3977704150fa2ed122bd81f0077b406009c95845ac7b6e2e776e
|
|
| MD5 |
133c40c0074a800f4b2a01118c11a11d
|
|
| BLAKE2b-256 |
2ef7ca0e4489e4ace7be928a136c1fbdfb89007979ca551833fd262e3df84630
|
File details
Details for the file chars_counter-0.4.0-py3-none-any.whl.
File metadata
- Download URL: chars_counter-0.4.0-py3-none-any.whl
- Upload date:
- Size: 5.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"20.1","id":"ulyssa","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 |
f68cda037bb48aee30fbcc16bcf8cf75b038ab5133e962ee4ecee629c5b75841
|
|
| MD5 |
6fec493e456c72f28916ef76125945dd
|
|
| BLAKE2b-256 |
9fbae2911320633a4c1ba3f42e1dd62e21c2dee0615408f81c310fd2895c7478
|