Skip to main content

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 09
Uppercase_Letters 65–90 AZ
Lowercase_Letters 97–122 az

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 character
  • position: 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

chars_counter-0.3.0.tar.gz (4.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

chars_counter-0.3.0-py3-none-any.whl (5.8 kB view details)

Uploaded Python 3

File details

Details for the file chars_counter-0.3.0.tar.gz.

File metadata

  • Download URL: chars_counter-0.3.0.tar.gz
  • Upload date:
  • Size: 4.1 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

Hashes for chars_counter-0.3.0.tar.gz
Algorithm Hash digest
SHA256 e5af2eca3280dde2d06c8004dc3dad6a704425e4287c985600233ce0bd01402c
MD5 00ac5ff278cfb811978bcd60845a55ad
BLAKE2b-256 5ceafed7f5de29f75007e36afcf3fbb35707d98a714c635401d5e6db80bd882f

See more details on using hashes here.

File details

Details for the file chars_counter-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: chars_counter-0.3.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

Hashes for chars_counter-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 371e5b31b2ec4d01ce9c39b75868a38885167ad9c70c39b9bd8e4ca498417aeb
MD5 48c76b5a33dee194bfb839588c5522bd
BLAKE2b-256 7fd8d4dce3f38e5466d1566b768b17a0480a962d89939c32a8d3b45b97037923

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page