Table of Contents

Python - Snippets

Counting with a Dictionary

If you use an ordinary dict for counting, you have to check if the key already exists and if not, you have to initialize it. There is a better way. Use defaultdict from collections. You can give it a callable object for the initialization. If you give it int, the default value will be 0.

from collections import defaultdict
 
fruit_basket = ["apple", "banana", "apple", "plum", "apricot", "kiwi", "plum"]
 
fruits = defaultdict(int)
for fruit in fruit_basket:
    fruits[fruit] += 1
 
for fruit in fruits:
    print(f"{fruit}: {fruits[fruit]}")   
Output
apple: 2
banana: 1
plum: 2
apricot: 1
kiwi: 1

Read Lines from File

with open("fruit_basket.txt", "r") as f:
    fruit_basket_lines = f.read().splitlines()

If you use f.readlines() instead, all elements will contain a \n.

Cache expensive Functions

If you have a function which does an expensive task like a web request but you expect it to give you the same return value if the arguments are the same, then you can use the lru_cache function from functools and decorate your function with it. With maxsize (have to be a power of 2) you can define for how many arguments the return values are saved.

import urllib.request
from functools import lru_cache
 
@lru_cache(maxsize=32)
def get_robots_file(url="https://wiki.defect.ch/robots.txt"):
    with urllib.request.urlopen(url) as response:
        data = response.read()
    return data

If you call get_robots_file() multiple times, only one web request will be performed. The last 32 different urls (maxsize) will be cached that way.

Save/load Data Structures to/from a File

Save to File

import pickle
with open("mydata.pickle", "wb") as f:
    pickle.dump(mydata, f, pickle.HIGHEST_PROTOCOL)

Load from File

import pickle
with open("mydata.pickle", "rb") as f:
    mydata = pickle.load(f)

Save to a Compressed File

import gzip
import pickle
with gzip.open("mydata.pickle.gz", "wb") as f:
    pickle.dump(mydata, f, protocol=pickle.HIGHEST_PROTOCOL)

Load from Compressed File

import gzip
import pickle
with gzip.open("mydata.pickle.gz", "rb") as f:
    mydata = pickle.load(f)

Get Hostname

import socket
HOSTNAME = socket.gethostname()

Get Script Directory

import os.path
script_directory = os.path.dirname(os.path.realpath(__file__))