10. Ein kurzer Überblick über die Standardbibliothek
****************************************************


10.1. Betriebssystemschnittstelle
=================================

Das Modul "os" bietet Dutzende von Funktionen für die Interaktion mit
dem Betriebssystem:

   >>> import os
   >>> os.getcwd()      # Return the current working directory
   'C:\\Python313'
   >>> os.chdir('/server/accesslogs')   # Change current working directory
   >>> os.system('mkdir today')   # Run the command mkdir in the system shell
   0

Verwenden Sie unbedingt den Stil "import os" anstelle von "from os
import *" “. Dadurch wird verhindert, dass "os.open()" die integrierte
Funktion "open()" überschreibt, die ganz anders funktioniert.

Die integrierten Funktionen "dir()" und "help()" sind nützliche
interaktive Hilfsmittel für die Arbeit mit großen Modulen wie "os"

   >>> import os
   >>> dir(os)<returns a list of all module functions>>>> help(os)
   <gibt eine ausführliche Handbuchseite zurück, die aus den Docstrings des Moduls erstellt wurde>

Für alltägliche Aufgaben der Datei- und Verzeichnisverwaltung bietet
das Modul "shutil" eine übergeordnete Schnittstelle, die einfacher zu
bedienen ist:

   >>> import shutil
   >>> shutil.copyfile('data.db', 'archive.db')
   'archive.db'
   >>> shutil.move('/build/executables', 'installdir')
   'installdir'


10.2. Datei-Platzhalter
=======================

Das Modul "glob" bietet eine Funktion zum Erstellen von Dateilisten
anhand von Verzeichnissuchen mit Platzhaltern:

   >>> import glob
   >>> glob.glob('*.py')
   ['primes.py', 'random.py', 'quote.py']


10.3. Befehlszeilenargumente
============================

Häufig verwendete Hilfsskripte müssen oft Kommandozeilenargumente
verarbeiten. Diese Argumente werden im *argv*-Attribut des Moduls
"sys" als Liste gespeichert. Nehmen wir zum Beispiel die folgende
Datei "demo.py":

   # File demo.py
   import sys
   print(sys.argv)

Hier ist die Ausgabe, die man erhält, wenn man "python demo.py one two
three" über die Befehlszeile ausführt:

   ['demo.py', 'one', 'two', 'three']

Das Modul "argparse" bietet einen ausgefeilteren Mechanismus zur
Verarbeitung von Befehlszeilenargumenten. Das folgende Skript
extrahiert einen oder mehrere Dateinamen sowie eine beliebige Anzahl
von Zeilen, die angezeigt werden sollen:

   import argparse

   parser = argparse.ArgumentParser(
       prog='top',
       description='Die ersten Zeilen jeder Datei anzeigen')
   parser.add_argument('filenames', nargs='+')
   parser.add_argument('-l', '--lines', type=int, default=10)
   args = parser.parse_args()
   print(args)

Wenn das Skript über die Befehlszeile mit dem Befehl "python top.py
--lines=5 alpha.txt beta.txt" ausgeführt wird, setzt es "args.lines" “
auf "5" und "args.filenames" auf "['alpha.txt', 'beta.txt']" “.


10.4. Umleitung der Fehlerausgabe und Beendigung des Programms
==============================================================

Das Modul "sys" verfügt außerdem über Attribute für *stdin*, *stdout*
und *stderr*. Letzteres ist nützlich, um Warnungen und Fehlermeldungen
auszugeben, damit diese auch dann sichtbar sind, wenn *stdout*
umgeleitet wurde:

   >>> sys.stderr.write('Warning, log file not found starting a new one\\n')
   Warning, log file not found starting a new one

Der direkteste Weg, ein Skript zu beenden, ist die Verwendung von
"sys.exit()".


10.5. Zeichenfolgenabgleich
===========================

Das Modul "re" stellt Werkzeuge für reguläre Ausdrücke zur erweiterten
Zeichenfolgenverarbeitung bereit. Für komplexe Abgleich- und
Bearbeitungsaufgaben bieten reguläre Ausdrücke prägnante, optimierte
Lösungen:

   >>> import re
   >>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
   ['foot', 'fell', 'fastest']
   >>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
   'cat in the hat'

Wenn nur einfache Funktionen benötigt werden, sind String-Methoden
vorzuziehen, da sie leichter zu lesen und zu debuggen sind:

   >>> 'tea for too'.replace('too', 'two')
   'tea for two'


10.6. Mathematik
================

Das Modul "math" ermöglicht den Zugriff auf die zugrunde liegenden
C-Bibliotheksfunktionen für Gleitkommaarithmetik:

   >>> import math
   >>> math.cos(math.pi / 4)
   0.70710678118654757
   >>> math.log(1024, 2)
   10.0

Das Modul "random" bietet Werkzeuge zur Durchführung von
Zufallsauswahlen:

   >>> import random
   >>> random.choice(['apple', 'pear', 'banana'])
   'apple'
   >>> random.sample(range(100), 10)   # Stichprobe ohne Zurücklegen
   [30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
   >>> random.random()    # Zufällige Fließkommazahl aus dem Intervall [0.0, 1.0)
   0.17970987693706186
   >>> random.randrange(6)    # Zufällige Ganzzahl gewählt aus range(6)
   4

Das Modul "statistics" berechnet grundlegende statistische Kennzahlen
(Mittelwert, Median, Varianz usw.) für numerische Daten:

   >>> import statistics
   >>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
   >>> statistics.mean(data)
   1.6071428571428572
   >>> statistics.median(data)
   1.25
   >>> statistics.variance(data)
   1.3720238095238095

Das SciPy-Projekt <https://scipy.org> bietet zahlreiche weitere Module
für numerische Berechnungen.


10.7. Internetzugang
====================

Es gibt eine Reihe von Modulen für den Zugriff auf das Internet und
die Verarbeitung von Internetprotokollen. Zwei der einfachsten sind
"urllib.request" zum Abrufen von Daten über URLs und "smtplib" zum
Versenden von E-Mails:

   >>> from urllib.request import urlopen
   >>> with urlopen('https://docs.python.org/3/') as response:
   ...     for line in response:
   ...         line = line.decode()             # Bytes in einen str umwandeln
   ...         if 'updated' in line:
   ...             print(line.rstrip())         # Abschließenden Zeilenumbruch entfernen
   ...
   "      Last updated on Nov 11, 2025 (20:11 UTC).

   >>> import smtplib
   >>> server = smtplib.SMTP('localhost')
   >>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
   ... \"\"\"To: jcaesar@example.org
   ... From: soothsayer@example.org
   ...
   ... Beware the Ides of March.
   ... """)
   >>> server.quit()

(Beachten Sie, dass für das zweite Beispiel ein auf „localhost“
laufender Mailserver erforderlich ist.)


10.8. Termine und Uhrzeiten
===========================

Das Modul "datetime" stellt Klassen zur Verfügung, mit denen sich
Datums- und Zeitangaben sowohl auf einfache als auch auf komplexe
Weise bearbeiten lassen. Zwar wird die Arithmetik mit Datums- und
Zeitangaben unterstützt, der Schwerpunkt der Implementierung liegt
jedoch auf der effizienten Extraktion von Elementen für die
Ausgabeformatierung und -bearbeitung. Das Modul unterstützt zudem
Objekte, die zeitzonenabhängig sind.

   >>> # Datumsangaben lassen sich leicht erstellen und formatieren
   >>> import datetime as dt
   >>> now = dt.date.today()
   >>> now
   datetime.date(2003, 12, 2)
   >>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
   '12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'

   >>> # Datumsangaben unterstützen Kalenderarithmetikc
   >>> birthday = dt.date(1964, 7, 31)
   >>> age = now - birthday
   >>> age.days
   14368


10.9. Datenkomprimierung
========================

Gängige Formate für die Datenarchivierung und -komprimierung werden
direkt von folgenden Modulen unterstützt: "zlib", "gzip", "bz2",
"lzma", "zipfile" und "tarfile".

   >>> import zlib
   >>> s = b'witch which has which witches wrist watch'
   >>> len(s)
   41
   >>> t = zlib.compress(s)
   >>> len(t)
   37
   >>> zlib.decompress(t)
   b'witch which has which witches wrist watch'
   >>> zlib.crc32(s)
   226805979


10.10. Leistungsmessung
=======================

Manche Python-Anwender interessieren sich sehr dafür, wie sich die
Leistung verschiedener Lösungsansätze für dasselbe Problem im
Vergleich zueinander darstellt. Python bietet ein Messwerkzeug, das
diese Fragen sofort beantwortet.

Beispielsweise könnte es verlockend sein, anstelle des herkömmlichen
Ansatzes zum Vertauschen von Argumenten die Funktion zum Packen und
Entpacken von Tupeln zu verwenden. Das Modul "timeit" veranschaulicht
schnell einen leichten Leistungsvorteil:

   >>> from timeit import Timer
   >>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
   0.57535828626024577
   >>> Timer('a,b = b,a', 'a=1; b=2').timeit()
   0.54962537085770791

Im Gegensatz zur feinen Granularität von "timeit" bieten die Module
"profile" und "pstats" Werkzeuge zur Identifizierung zeitkritischer
Abschnitte in größeren Code-Blöcken.


10.11. Qualitätskontrolle
=========================

Ein Ansatz zur Entwicklung hochwertiger Software besteht darin, für
jede Funktion im Zuge ihrer Entwicklung Tests zu schreiben und diese
Tests während des Entwicklungsprozesses regelmäßig auszuführen.

Das Modul "doctest" bietet ein Werkzeug zum Durchsuchen eines Moduls
und zum Überprüfen von Tests, die in den Docstrings eines Programms
eingebettet sind.  Die Erstellung von Tests ist so einfach wie das
Kopieren und Einfügen eines typischen Aufrufs zusammen mit seinen
Ergebnissen in den Docstring. Dies verbessert die Dokumentation, indem
es dem Benutzer ein Beispiel liefert, und ermöglicht es dem
*doctest*-Modul, sicherzustellen, dass der Code der Dokumentation
entspricht:

   def average(values):
       """Berechnet das arithmetische Mittel einer Liste von Zahlen.

       >>> print(average([20, 30, 70]))
       40.0
       """
       return sum(values) / len(values)

   import doctest
   doctest.testmod()   # eingebettete Tests automatisch validieren

Das Modul "unittest" ist nicht ganz so einfach zu handhaben wie das
Modul "doctest" “, ermöglicht jedoch die Pflege einer umfassenderen
Reihe von Tests in einer separaten Datei:

   import unittest

   class TestStatisticalFunctions(unittest.TestCase):

       def test_average(self):
           self.assertEqual(average([20, 30, 70]), 40.0)
           self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
           with self.assertRaises(ZeroDivisionError):
               average([])
           with self.assertRaises(TypeError):
               average(20, 30, 70)

   unittest.main()  # Der Aufruf über die Befehlszeile führt alle Tests aus


10.12. Batterien im Lieferumfang enthalten
==========================================

Python verfolgt die Philosophie „Batteries included“. Dies zeigt sich
am deutlichsten an den ausgefeilten und robusten Funktionen seiner
größeren Pakete. Zum Beispiel:

* Die Module "xmlrpc.client" und "xmlrpc.server" machen die
  Implementierung von Remote Procedure Calls zu einer fast trivialen
  Aufgabe. Trotz der Namen der Module sind keine direkten Kenntnisse
  oder der Umgang mit XML erforderlich.

* Das Paket "email" ist eine Bibliothek zur Verwaltung von E-Mail-
  Nachrichten, einschließlich MIME- und anderer auf dem **RFC 5322**
  basierender Nachrichtendokumente. Im Gegensatz zu "smtplib" und
  "poplib" , die tatsächlich Nachrichten senden und empfangen, verfügt
  das E-Mail-Paket über ein umfassendes Toolset zum Erstellen oder
  Dekodieren komplexer Nachrichtenstrukturen (einschließlich Anhängen)
  sowie zur Implementierung von Internet-Kodierungs- und Header-
  Protokollen.

* Das Paket "json" bietet umfassende Unterstützung für die Analyse
  dieses gängigen Datenaustauschformats. Das Modul "csv" unterstützt
  das direkte Lesen und Schreiben von Dateien im CSV-Format (Comma-
  Separated Value), das von Datenbanken und
  Tabellenkalkulationsprogrammen allgemein unterstützt wird. Die XML-
  Verarbeitung wird durch die Pakete "xml.etree.ElementTree" ,
  "xml.dom" und "xml.sax" unterstützt. Zusammen vereinfachen diese
  Module und Pakete den Datenaustausch zwischen Python-Anwendungen und
  anderen Tools erheblich.

* Das Modul "sqlite3" ist eine Hülle für die SQLite-
  Datenbankbibliothek und stellt eine persistente Datenbank bereit,
  die mithilfe einer leicht vom Standard abweichenden SQL-Syntax
  aktualisiert und abgefragt werden kann.

* Die Internationalisierung wird durch eine Reihe von Modulen
  unterstützt, darunter "gettext" , "locale" und das Paket "codecs" .
