Python strftime und strptime richtig verwenden

Python bietet mit strftime() und strptime() aus der datetime Standardbibliothek zwei nützliche Funktionen um mit Zeit-Strings arbeiten zu können, schauen wir uns an, wie wir sie richtig verwenden.

Mit strftime() Zeit-Strings erstellen

Mit Hilfe der strftime() Funktion (merke: string from time) erstellt man aus date, datetime und time Objekten einfache Strings. Dazu benötigt es nur einen sogenannten Format-String, der beschreibt, was in dem Zeit String enthalten sein soll. Damit erstellt man dann beliebige Strings, die z.B. in einer grafischen Oberfläche angezeigt werden können.

In einem einfachen Beispiel erzeugen wir zunächst ein datetime Objekt, also ein Objekt, das sowohl ein Datum als auch eine Uhrzeit enthält. Mit der strftime() Funktion und unterschiedlichen Format String erstellen wir dann verschiedene Strings, z.B. um für Menschen unterschiedlicher Herkunft ihre gewohnte Schreibweise zu erzeugen.

german_date_format = "%d.%m.%Y"
us_date_format = "%Y-%m-%d"
time_obj = datetime.datetime.now()
print(time_obj)
print(time_obj.strftime(german_date_format))
print(time_obj.strftime(us_date_format))
„Python strftime und strptime richtig verwenden“ weiterlesen

Speichern von Strings in HDF5 Dateien mit h5py

Im folgenden Beitrag zeige ich ein einfaches Beispiel wie das Speichern von Strings mittels h5py als Dataset in HDF5 Dateien funktioniert.

HDF5 Daten als wissenschaftliches Speichermedium

In einem meiner R&D Projekte in der Medizintechnik führen wir Schnelltests (z.B. Blutzucker oder COVID Antigen Tests) auf sogenannten Point-of-Care Geräten durch. Dabei sind die Geräte, die sich noch in der Entwicklung befinden, so eingestellt, dass sie ein DEBUG Log erzeugen. Dieses Log ist natürlich von essentieller Bedeutung für die daran beteiligten Wissenschaftler und muss für tausende von durchgeführten Tests verfügbar und mit wissenschaftlicher Analysesoftware auszuwerten sein. Zusätzlich entstehen Messdaten der verschiedenen Sensoren und ausserdem gibt es für jeden Test einen Satz von Metadaten. Ein ideales Werkzeug sind dafür Dateien im HDF5 Format. Für jeden Test ensteht also eine HDF5 Datei, die im R&D Fall auch das DEBUG Log enthält.

„Speichern von Strings in HDF5 Dateien mit h5py“ weiterlesen

Sicheres Einfügen in ein Dictionary

Hier ist ein Stück Code über das ich mal gestolpert bin. Ich habe das tatsächlich schon desöfteren genau so gebraucht. Bislang kannte ich die setdefault() Funktion noch nicht.

dict_of_duplicates_docs = {}

for doc in documents: # documents sind dictionaries mit einer Datenbank _id
    hashval = get_hashval(doc) # gibt einen hash für dieses Dokument zurück
                               # der identisch ist, wenn es sich um das 
                               # gleiche Dokument handelt 
                               # (unabhängig von der DB _id)
    _id = doc["_id"]    
    dict_of_duplicate_docs.setdefault(hashval, []).append(_id)

Wenn hashval noch nicht im Dictionary vorhanden ist, setzt setvalue diesen key und speichert die leere Liste als value. Es gibt dann den value für den key aus hashval zurück.

In diesen Rückgabewert, die (leere) Liste der ids, fügen wir dann gleich die neue _id ein.

Man muss also nicht erst im Dict nachschlagen, ob der Key schon existiert und manuell die leere Liste setzen, nur um sicher zu sein, dass es keinen KeyError beim Schreiben der _id gibt.

Am Ende finden wir also die Duplikate, wenn in der Liste mehr als eine _id eingetragen wurde:

{ 
  "hashA": ["id_1", "id_3", "id_4"],
  "hashB": ["id_2"]
}

Virtual environments in Python erstellen

In diesem Betriag erkläre ich das Erstellen von virtual environments in Python und welche Vorteile diese mit sich bringen.

Anlegen von virtual environments in Python

Eine neue virtuelle Umgebung erstellt man mit Python entweder über virtualenv (für Python 2.x und auch Python3.x) oder über das seit Python3.3 vorhandene venv Modul.

    christian@ubuntu:~$ python3 -m pip install --user virtualenv

    christian@ubuntu:~$ virtualenv venv2.7 -p python2.7
    Running virtualenv with interpreter /usr/bin/python2.7
    Already using interpreter /usr/bin/python2.7
    New python executable in /home/christian/venv2.7/bin/python2.7
    Also creating executable in /home/christian/venv2.7/bin/python
    Installing setuptools, pip, wheel...
    done.

    christian@ubuntu:~$ virtualenv venv
    Using base prefix '/usr'
    New python executable in /home/christian/venv/bin/python3.6
    Also creating executable in /home/christian/venv/bin/python
    Installing setuptools, pip, wheel...
    done.

    christian@ubuntu:~$ python3.8 -m venv my_venv    

„Virtual environments in Python erstellen“ weiterlesen

Python dataclasses in Beispielen erklärt

Seit Python Version 3.7 gibt es ein neues Modul für spezielle Daten-Klassen, die dataclasses.

https://docs.python.org/3.7/library/dataclasses.html

@dataclass decorator für eine Klasse benutzen

Mit dem dataclass decorator ergeben sich viele neue Möglichkeiten Daten-Klassen basierend auf ihren Klassenvariablen zu erzeugen. Ein entsprechender decorator markiert eine Klasse als dataclass. Damit wird dafür gesorgt, dass automatisch eine __init__() Methode erzeugt wird, die die Klassenvariablen als Argumente enthält. Sind die Klassenvariablen mit entsprechenden Typen annotiert, erfolgt auch automatisch eine Prüfung in der IDE.

pycharm zeigt eine Warnung wenn der Typ der Variable nicht mit dem definierten Typ übereinstimmt

Ein einfaches Beispiel zeigt, wie eine dataclass benutzt werden kann.

from dataclasses import dataclass


@dataclass
class Car:
    manufacturer: str = None
    model: str = None
    color: str = None
    length: float = None
    seats: int = None
    is_suv: bool = None


def main():
    new_car = Car(
        manufacturer="Tesla",
        model="Model X",
        color="blue",
        length=5.0,
        seats=5,
        is_suv=True,
    )
    print(new_car)
    if new_car.is_suv:
        print(f"{new_car.manufacturer} {new_car.model} is a SUV")
„Python dataclasses in Beispielen erklärt“ weiterlesen

Python List Comprehension erstellen

Im folgenden Beitrag erkläre ich Python List Comprehension als Methode um Listen effektiv und mit wenig Code zu erstellen. Grundlage bilden hierbei immer andere iterierbare Objekte, wie Listen oder Dictionaries.

Wie man durch Listen iterieren kann oder auf Elemente einer Liste zugreift, erkläre ich im Artikel Python Listen erstellen und bearbeiten

List Comprehension erstellen

Eine List Comprehensionist immer eine Liste, die einen Ausdruck, eine Schleife und gegebenenfalls mehrere weitere Schleifen oder Bedingungen enthält.

Ein einfaches Beispiel, in dem die Werte der ursprünglichen Liste mit 2 multipliziert werden:

>>> numbers = [1,2,3,4,5,6]
>>> numbers_times_2 = [x*2 for x in numbers]
>>> numbers_times_2
[2, 4, 6, 8, 10, 12]

„Python List Comprehension erstellen“ weiterlesen

Python Listen erstellen und bearbeiten

Ein einfaches Array – Python List

Listen in Python zu erstellen und zu bearbeiten ist mit nur wenigen Schritten möglich. Deswegen zeige ich hier, wie es geht:

Erstellen einer Liste

Arrays bzw Listen können in Python ähnlich zu anderen Programmiersprachen benutzt werden. Eine Liste erstellt man mit Hilfe von eckigen Klammern. Die Werte einer Liste können unterschiedlichen Typs sein und werden per Komma getrennt.

>>> my_list = ['a', 'b', 1, 2, ['c', 3], {'key': 'value'}]

Unsere Liste enthält Strings und Integers, eine weitere Liste und auch ein Dictionary.

Zugriff auf Elemente einer Liste

Der Zugriff auf einzelne Elemente einer Liste kann über die genaue Angabe der Listenposition erfolgen. Diese Listenposition heißt Index. Ist das selektierte Element der Liste ebenso eine Liste, kann man erneut über den Index auf ein Element dieser zweiten Liste zugreifen.

>>> my_cars = ['Audi', 'Mercedes', 'BMW', ['VW Golf', 'VW Passat'], 'Ford']
>>> my_cars[3]
['VW Golf', 'VW Passat']

>>> my_cars[3][0]  
# returns the 1st element from the object 
# at index 3 of the my_cars list 
'VW Golf'

„Python Listen erstellen und bearbeiten“ weiterlesen

Python kwargs – Python Funktions Parameter

Python kwargs – keyword arguments

Python Funktionen enthalten in der Regel Parameter. Meistens werden neben den normalen Parametern auch Parameter, die einen Standardwert bzw default bereits in der Funktionsdefinition enthalten, benutzt.

Positionsgebunden oder über Schlüsselwort

Ein einfaches Beispiel:

def welcome(first_name, last_name="Last Name"):
    print(first_name, last_name)

Die Funktion welcome besitzt zwei Parameter: first_name und last_name

Der zweite Parameter last_name hat per Funktionsdefinition bereits einen Standardwert zugewiesen bekommen. Wird nun beim Funktionsaufruf das Argument für last_name weggelassen, so wird dem Parameter automatisch der Standartwert zugewiesen. Andernfalls benutzt der Interpreter das entsprechende Argument.

>>> welcome("Christian") 
Christian Last Name 
>>> welcome("Christian", last_name="Scholz") 
Christian Scholz
„Python kwargs – Python Funktions Parameter“ weiterlesen

Python Parameter Typen

Python Parameter Typen können seit der Version 3.5 in einer Funktion angegeben werden. Man kann also in der Funktion bereits definieren, dass ein Parameter z.B. vom Typ float ist. Genauso können auch die Rückgabewerte der Funktion definiert werden.

Ein einfaches Beispiel aus der aktuellen Python 3.7 Dokumentation zu Type aliases :

from typing import List
Vector = List[float]
 
def scale(scalar: float, vector: Vector) -> Vector:
    return [scalar * num for num in vector]
 
# typechecks; a list of floats qualifies as a Vector.
new_vector = scale(2.0, [1.0, -4.2, 5.4])

In dem oben geziegten Code Ausschnitt importieren wir zunächst den Typ ‚List‘. Diesen benutzen wir anschließend, um einen neuen Typ ‚Vector‘ zu definieren. Vector ist dabei ein Alias für eine Liste von float Werten.

„Python Parameter Typen“ weiterlesen

Das import Statement

Module importieren

Im Artikel über Scripte in Python sind wir bereits darüber gestolpert: das import Statement. Wir haben in diesem Script ein weiteres Script bzw „Modul“ importiert, und waren somit in der Lage auf Variablen und Funktionen dieses importierten Moduls zuzugreifen. Doch was passiert eigentlich genau wenn der Python Interpreter ein import Statement verarbeitet, und welche Varianten gibt es neben dem bereits verwendetem „import x“ weiterhin?

Eine Standard-Installation von Python bietet bereits eine Fülle von Modulen und Paketen mit denen ein Programmierer direkt starten kann. Ich werde hier ein paar dieser Standard-Module benutzen, um das import Statement näher zu erläutern. Eine Liste aller verfügbaren Module findet sich im Python Module Index.

Das es sich bei „import“ um ein Statement handelt, gibt es hier keine Klammern oder Anführungszeichen bei dem sich anschließenden Modulnamen. Genauso wenig gibt es hier Rückgabewerte. Der Modulname legt zudem zwei Dinge fest: zum einen das Modul, das gesucht und import werden soll, zum anderen den Variablennamen, unter dem das Modul nachfolgend angesprochen werden kann.

Im folgenden Code Stück wird das Modul „os“ (Miscellaneous operating system interfaces) importiert. „os“ ist nun der Name der Variable, die wir für den Zugriff auf Funktionen oder Attribute des importieren Moduls benutzen können. Wir rufen die Funktion „getcwd“ auf.

import os 
os.getcwd()
„Das import Statement“ weiterlesen