My Python Cheat Sheet

There are a handful of things I do in Python all the time but I can never remember the syntax for, so I'm making myself a cheat sheet. Hopefully others will find this useful as well.

Published: 01/14/2022 , Updated: 01/14/2022

Note: These examples use Python 3.x, not Python 2.x. Unless you're stuck with some legacy system, you shouldn't use 2.x.

Setting up ConfigParser

First, create a configuration.txt file. (and always make sure to either globally add this to your .gitignore file or do it in the current project!)

[example]
API_KEY=foo

Now you can use it in your programs:

import configparser

config = configparser.ConfigParser()
config.read('configuration.txt')
api_key = config['example'].get('API_KEY')

Slugify a String

Use the python-slugify package:

$ pip install python-slugify

Now you can use it:

>>> import slugify
>>> slugify.slugify("Thé h@ppy dog went ~ and came back!")
the-h-ppy-dog-went-and-came-back

Set up Jinja2 Template Rendering

A number of configuration options need to be set and I have to look them up all the time.

import arrow
import jinja2

# Set up the template engine
template_loader = jinja2.FileSystemLoader('./templates')
template_env = jinja2.Environment(loader=template_loader)
template_env.filters['fmt_date'] = lambda v: arrow.get(v, fmt).format(fmt)

# Write the file
template = template_env.get_template('template.html')
html = template.render(data={})
pathlib.Path('index.html').write_text(html)

Combine Two Equal-Sized Lists into a Dictionary

I use this all the time when working with CSV files.

>>> list1 = ["Column A", "Column B", "Column C"]
>>> list2 = ["Value 1", "Value 2", "Value 3"]
>>> dict(zip(list1, list2))
{'Column B': 'Value 2', 'Column C': 'Value 3', 'Column A': 'Value 1'}

Configuring Argparse

import argparse
import arrow
import pathlib

def valid_date_arg(value):
    """ Used by argparser to validate date arguments """
    try:
        return arrow.get(value, 'YYYY-MM-DD')
    except arrow.parser.ParserError:
        msg = f'Not a valid date in YYYY-MM-DD format: "{value}"'
        raise argparse.ArgumentTypeError(msg)


def valid_filepath_arg(value):
    """ Used by argparse to see if a file exists """
    filepath = pathlib.Path(value)

    if not filepath.exists():
        msg = f'File "{arg}" does not exist'
        raise argparse.ArgumentTypeError(msg)
    else:
        return filepath


def valid_dir_arg(value):
    """ Used by argparse to see if a directory exists """
    filepath = pathlib.Path(value)

    if not filepath.exists() or not filepath.is_dir():
        msg = f'Directory "{arg}" does not exist'
        raise argparse.ArgumentTypeError(msg)
    else:
        return filepath


# Read command-line arguments
argparser = argparse.ArgumentParser()
argparser.add_argument('date', type=valid_date_arg)
argparser.add_argument('directory', type=valid_dir_arg)
args = argparser.parse_args()

Arrow Time Formatting

Here are all the formats you use when formatting an Arrow object:

>>> import arrow
>>> arrow.now().format('YYYY-MM-DD')
Token Output
Year YYYY 2000, 2001, 2002 ... 2012, 2013
YY 00, 01, 02 ... 12, 13
Month MMMM January, February, March
MMM Jan, Feb, Mar
MM 01, 02, 03 ... 11, 12
M 1, 2, 3 ... 11, 12
Day of Year DDDD 001, 002, 003 ... 364, 365
DDD 1, 2, 3 ... 364, 365
Day of Month DD 01, 02, 03 ... 30, 31
D 1, 2, 3 ... 30, 31
Do 1st, 2nd, 3rd ... 30th, 31st
Day of Week dddd Monday, Tuesday, Wednesday
ddd Mon, Tue, Wed
d 1, 2, 3 ... 6, 7
ISO week date W 2011-W05-4, 2019-W17
Hour HH 00, 01, 02 ... 23, 24
H 0, 1, 2 ... 23, 24
hh 01, 02, 03 ... 11, 12
h 1, 2, 3 ... 11, 12
AM / PM A AM, PM, am, pm
a am, pm
Minute mm 00, 01, 02 ... 58, 59
m 0, 1, 2 ... 58, 59
Second ss 00, 01, 02 ... 58, 59
s 0, 1, 2 ... 58, 59
Sub-second S... 0, 02, 003, 000006, 123123123123
Timezone ZZZ Asia/Baku, Europe/Warsaw, GMT
ZZ -07:00, -06:00 ... +06:00, +07:00, +08, Z
Z -0700, -0600 ... +0600, +0700, +08, Z
Seconds Timestamp X 1381685817, 1381685817.915482
ms or µs Timestamp x 1569980330813, 1569980330813221

Simple Logging

I wrote a simple logging wrapper to simplify setting up logging in a project: https://github.com/greencoder/ezlogs

$ pip install ezlogs

Example usage:

import ezlogs

logger = ezlogs.Logger(file_name='log.txt', console_level='debug', file_level='info')

logger.info('This is an informational message')
logger.debug('This is a debugging message')