Skip to main content
Python Software Foundation 20th Year Anniversary Fundraiser  Donate today!

A set of useful utilities for python programs

Project description

Tests Codecov Python PyPI


a set of utilities for python3.6+ programs and scripts.


Install for the user:

pip3 install ccautils --user

Install for a virtual environment:

pip install ccautils


I use poetry to manage these utilities. Clone this repository and install poetry, then install the dependancies.

git clone
cd ccautils
poetry install


To run the tests you must have pytest, nox and poetry installed.

install nox into your python user environment.

pip install nox --user

Run the tests with

nox -rs tests

Run the linter with

nox -rs lint

Run the console ask tests with

nox -rs tests -- -sm ask

Error Utilities(#headdd)

See the code for how to use these Exception helpers.

Miscellaneous Utilities


import ccautils.utils as UT

addToString(xstr, xadd)


Returns a string with xadd appended to xstr. If xadd is a list, all str members of the list will be appended in order.

UT.addToString("hello", [" ", "world"])

> "hello world"

delimitString(xstr, delimeter=" - ")


xstr can be a list or a string. If it is a string, it is spit apart at spaces and delimeted with delimeter. If it is a list, each member is delimeted with delimeter.

UT.delimitString(["bright", "world"], " ")

> "bright world"

UT.delimitString("I wandered lonely as an artichoke", ".")

> ""



Constructs a dictionary from a string of parameters. Leading and trailing whitespace is stripped.

istr should be in the form someparam=somevalue,someotherparam=otherval

UT.makeDictFromString("sparam=sval, soparam = soval")

> {"sparam": "sval", "soparam": "soval"}

askMe(q, default)


Requests input from the user. Poses the question q. Returns the users input or default if no input given.

UT.askMe("press 5, please", "8")

> press 5, please: 5
> 5

padStr(xstr, xlen=2, pad=" ", padleft=True)


Returns xstr padded to the required length, either on the left (padleft is True) or the right (padleft is False)

UT.padStr("23", 5, "0")

> "00023"

reduceTime(unit, secs)


Divides secs by unit returning a tuple of (units, remainder)

Raises a ValueError if unit is zero.

UT.reduceTime(3600, 3700)

> (1, 100)

displayValue(val, label, zero=True)


Pluralises label if val > 1 or val is 0.

Will return an empty string if val == 0 and zero == True

UT.displayValue(12, "table")

> "12 tables"



converts HMS strings into integer seconds

# 1 hour, 1 minute, 23 seconds + 0.43 second

> 3683

hms(secs, small=True, short=True, single=False, colons=False)


Convert secs to days, hours, minutes and seconds

if small is True then only return the higher values if they are > zero

if short is True then the labels are their short form

if single is True then the labels are single letters

if colons is True then the output is of the form 01:03:23


> "1 min and 7 secs"

UT.hms(67, short=False)

> "1 minute and 7 seconds"

UT.hms(67, small=False, short=False)

> "0 days, 0 hours, 1 minute and 7 seconds"

secs = 86400 + 7200 + 300 + 34
UT.hms(secs, single=True)

> "1d 2h 5m 34s"

secs = 345
UT.hms(secs, colons=True)

> "05:45"

secs = 86400 + 7200 + 300 + 34
UT.hms(secs, colons=True)

> "01:02:05:34"



Given a datetime object, computes the difference between now and that time. Returns a tuple of (ts: unix timestamp of dt, op: string)

The returned string gives the approximate time left between now and the dt object or the string 'EXPIRED'.

    """It returns 2 hours 20 minutes and some seconds."""
    ts = int(time.time())
    ts += (3600 * 2) + (60 * 20)
    dt = datetime.datetime.fromtimestamp(ts)
    gotts, gotstr = UT.fuzzyExpires(dt)

    """It returns 1 year and 2 months."""
    ts = int(time.time())
    ts += (86400 * 365) + (86400 * 70)
    dt = datetime.datetime.fromtimestamp(ts)
    gotts, gotstr = UT.fuzzyExpires(dt)

File Utilities


import ccautils.fileutils as FT



Tests for the existence of the fully-qualified (absolute) file name fqfn

Returns: True if fqfn exists, else False

fn = "/home/chris/output.csv"
if FT.fileExists(fn):
    # do something
    raise(f"File {fn} does not exist")



Tests for the existence of the fully-qualified (absolute) directory name fqdn

Returns: True if fqdn exists, else False

dn = "/home/chris"
if FT.dirExists(dn):
    # do something
    raise(f"Directory {dn} does not exist")



Tests to see if the file fqdfn exists, if not checks if fqdfn is a directory that exists.

Returns: True if fqdfn exists, else False

dn = "/home/chris"
if FT.dfExists(dn):
    # do something
    raise(f"File / Directory {dn} does not exist")



Makes the path pn including any missing parent directories. Does nothing if path pn already exists.

Returns: None

dn = "/home/chris/appdir/subdir"

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for ccautils, version 0.4.2
Filename, size File type Python version Upload date Hashes
Filename, size ccautils-0.4.2-py3-none-any.whl (22.2 kB) File type Wheel Python version py3 Upload date Hashes View
Filename, size ccautils-0.4.2.tar.gz (23.6 kB) File type Source Python version None Upload date Hashes View

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring DigiCert DigiCert EV certificate Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page