10. Brief Tour of the Standard Library

10.1. Operating System Interface

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

>>> import os
>>> os.getcwd()      # Return the current working directory
'C:\\Python312'
>>> 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>

For daily file and directory management tasks, the shutil module provides a higher level interface that is easier to use:

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

10.2. File Wildcards

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. Command Line Arguments

Common utility scripts often need to process command line arguments. These arguments are stored in the sys module’s argv attribute as a list. For instance, let’s take the following demo.py file:

# 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']

The argparse module provides a more sophisticated mechanism to process command line arguments. The following script extracts one or more filenames and an optional number of lines to be displayed:

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. Error Output Redirection and Program Termination

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. String Pattern Matching

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)   # sampling without replacement
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random()    # random float
0.17970987693706186
>>> random.randrange(6)    # random integer chosen from 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. Internet Access

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('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 für das zweite Beispiel ein auf „localhost“ laufender Mailserver erforderlich ist.)

10.8. Dates and Times

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.

>>> # 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. Data Compression

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. Performance Measurement

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. Quality Control

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. Batteries Included

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.

  • The email package is a library for managing email messages, including MIME and other RFC 2822-based message documents. Unlike smtplib and poplib which actually send and receive messages, the email package has a complete toolset for building or decoding complex message structures (including attachments) and for implementing internet encoding and header protocols.

  • 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 .