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.4.0.tar.gz (4.0 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.4.0-py3-none-any.whl (5.8 kB view details)

Uploaded Python 3

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

Hashes for chars_counter-0.4.0.tar.gz
Algorithm Hash digest
SHA256 d2dfa6bc2e4d3977704150fa2ed122bd81f0077b406009c95845ac7b6e2e776e
MD5 133c40c0074a800f4b2a01118c11a11d
BLAKE2b-256 2ef7ca0e4489e4ace7be928a136c1fbdfb89007979ca551833fd262e3df84630

See more details on using hashes here.

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

Hashes for chars_counter-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f68cda037bb48aee30fbcc16bcf8cf75b038ab5133e962ee4ecee629c5b75841
MD5 6fec493e456c72f28916ef76125945dd
BLAKE2b-256 9fbae2911320633a4c1ba3f42e1dd62e21c2dee0615408f81c310fd2895c7478

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