====== 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]}")
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__))