10. Kurzer Rundgang durch die Standardbibliothek

10.1. Betriebssystem-Schnittstelle

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

>>> import os
>>> os.getcwd()      # Return the current working directory
'C:\\Python314'
>>> 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 *. Dies verhindert, dass os.open() die integrierte Funktion open() überschattet, die sich viel anders verhält.

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)
<returns an extensive manual page created from the module's docstrings>

Für tägliche Datei- und Verzeichnisverwaltungsaufgaben bietet das Modul shutil eine einfachere High-Level-Schnittstelle

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

10.2. Datei-Wildcards

Das Modul glob bietet eine Funktion zum Erstellen von Dateilisten aus Verzeichnis-Wildcardsuchen

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

10.3. Kommandozeilenargumente

Gängige Dienstprogramme benötigen oft die Verarbeitung von Kommandozeilenargumenten. Diese Argumente werden im Attribut argv 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 bei der Ausführung von python demo.py one two three in der Kommandozeile

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

Das Modul argparse bietet einen ausgefeilteren Mechanismus zur Verarbeitung von Kommandozeilenargumenten. Das folgende Skript extrahiert einen oder mehrere Dateinamen und eine optionale Anzahl von anzuzeigenden Zeilen

import argparse

parser = argparse.ArgumentParser(
    prog='top',
    description='Show top lines from each file')
parser.add_argument('filenames', nargs='+')
parser.add_argument('-l', '--lines', type=int, default=10)
args = parser.parse_args()
print(args)

Bei der Ausführung in der Kommandozeile mit python top.py --lines=5 alpha.txt beta.txt werden args.lines auf 5 und args.filenames auf ['alpha.txt', 'beta.txt'] gesetzt.

10.4. Umleitung der Fehlerausgabe und Programmabbruch

Das Modul sys verfügt auch über Attribute für stdin, stdout und stderr. Letzteres ist nützlich für die Ausgabe von Warnungen und Fehlermeldungen, 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. Zeichenketten-Mustererkennung

Das Modul re bietet Werkzeuge für reguläre Ausdrücke für die erweiterte Zeichenkettenverarbeitung. Für komplexe Mustererkennung und -manipulation 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 Fähigkeiten benötigt werden, sind Zeichenkettenmethoden 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 bietet Zugriff auf die zugrundeliegenden C-Bibliotheksfunktionen für Fließkommamathematik

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

Das Modul random bietet Werkzeuge zur Erzeugung zufälliger Auswahlen

>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(range(100), 10)   # sampling without replacement
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random()    # random float from the interval [0.0, 1.0)
0.17970987693706186
>>> random.randrange(6)    # random integer chosen from range(6)
4

Das Modul statistics berechnet grundlegende statistische Eigenschaften (Mittelwert, Median, Varianz usw.) von numerischen 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.de> enthält viele weitere Module für numerische Berechnungen.

10.7. Internet-Zugang

Es gibt eine Reihe von Modulen für den Internetzugang und die Verarbeitung von Internetprotokollen. Zwei der einfachsten sind urllib.request zum Abrufen von Daten von URLs und smtplib zum Senden von E-Mails

>>> from urllib.request import urlopen
>>> with urlopen('http://worldtimeapi.org/api/timezone/etc/UTC.txt') as response:
...     for line in response:
...         line = line.decode()             # Convert bytes to a str
...         if line.startswith('datetime'):
...             print(line.rstrip())         # Remove trailing newline
...
datetime: 2022-01-01T01:36:47.689215+00:00

>>> 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 das zweite Beispiel einen auf localhost laufenden Mailserver benötigt.)

10.8. Daten und Zeiten

Das Modul datetime liefert Klassen für die einfache und komplexe Manipulation von Daten und Zeiten. Obwohl Datums- und Zeitarithmetik unterstützt wird, liegt der Fokus der Implementierung auf der effizienten Extraktion von Mitgliedern für die Ausgabeformatierung und -manipulation. Das Modul unterstützt auch zeitzonenbewusste Objekte.

>>> # dates are easily constructed and formatted
>>> from datetime import date
>>> now = 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.'

>>> # dates support calendar arithmetic
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368

10.9. Datenkompression

Gängige Datenarchivierungs- und Kompressionsformate werden direkt von Modulen unterstützt, darunter: 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

Einige Python-Benutzer entwickeln ein tiefes Interesse daran, die relative Leistung verschiedener Ansätze für dasselbe Problem zu kennen. Python bietet ein Messwerkzeug, das diese Fragen sofort beantwortet.

Es kann beispielsweise verlockend sein, die Tupel-Pack- und Entpackungsfunktion anstelle des traditionellen Ansatzes zum Vertauschen von Argumenten zu verwenden. Das Modul timeit demonstriert schnell einen bescheidenen 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 Codeblöcken.

10.11. Qualitätssicherung

Ein Ansatz zur Entwicklung hochwertiger Software ist, für jede entwickelte Funktion Tests zu schreiben und diese Tests während des Entwicklungsprozesses häufig auszuführen.

Das Modul doctest bietet ein Werkzeug zum Scannen eines Moduls und zum Validieren von Tests, die in den Docstrings eines Programms eingebettet sind. Die Testkonstruktion ist so einfach wie das Kopieren und Einfügen eines typischen Aufrufs zusammen mit seinen Ergebnissen in den Docstring. Dies verbessert die Dokumentation, indem dem Benutzer ein Beispiel gegeben wird, und ermöglicht dem doctest-Modul, sicherzustellen, dass der Code der Dokumentation treu bleibt

def average(values):
    """Computes the arithmetic mean of a list of numbers.

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

import doctest
doctest.testmod()   # automatically validate the embedded tests

Das Modul unittest ist nicht so mühelos wie das Modul doctest, erlaubt aber die Pflege eines umfassenderen Satzes 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()  # Calling from the command line invokes all tests

10.12. Batterien enthalten

Python verfolgt die Philosophie „Batterien enthalten“. Dies zeigt sich am besten in den ausgefeilten und robusten Fähigkeiten 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 ist keine direkte Kenntnis oder Handhabung von XML erforderlich.

  • Das Paket email ist eine Bibliothek zur Verwaltung von E-Mail-Nachrichten, einschließlich MIME und anderer RFC 2822-basierter Nachrichtendokumente. Im Gegensatz zu smtplib und poplib, die tatsächlich Nachrichten senden und empfangen, verfügt das E-Mail-Paket über ein vollständiges Toolset zum Erstellen oder Dekodieren komplexer Nachrichtenstrukturen (einschließlich Anhängen) und zur Implementierung von Internet-Encoding- und Header-Protokollen.

  • Das Paket json bietet robuste Unterstützung für das Parsen dieses beliebten Datenformats. Das Modul csv unterstützt das direkte Lesen und Schreiben von Dateien im Comma-Separated Value (CSV)-Format, das von Datenbanken und Tabellenkalkulationen häufig unterstützt wird. XML-Verarbeitung wird von den Paketen xml.etree.ElementTree, xml.dom und xml.sax unterstützt. Zusammen vereinfachen diese Module und Pakete den Datenaustausch zwischen Python-Anwendungen und anderen Werkzeugen erheblich.

  • Das Modul sqlite3 ist ein Wrapper für die SQLite-Datenbankbibliothek und bietet eine persistente Datenbank, die mit einer leicht nicht standardmäßigen SQL-Syntax aktualisiert und abgerufen werden kann.

  • Internationalisierung wird von einer Reihe von Modulen unterstützt, darunter gettext, locale und das Paket codecs.