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.clientundxmlrpc.servermachen 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
emailist eine Bibliothek zur Verwaltung von E-Mail-Nachrichten, einschließlich MIME und anderer RFC 2822-basierter Nachrichtendokumente. Im Gegensatz zusmtplibundpoplib, 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
jsonbietet robuste Unterstützung für das Parsen dieses beliebten Datenformats. Das Modulcsvunterstü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 Paketenxml.etree.ElementTree,xml.domundxml.saxunterstützt. Zusammen vereinfachen diese Module und Pakete den Datenaustausch zwischen Python-Anwendungen und anderen Werkzeugen erheblich.Das Modul
sqlite3ist 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,localeund das Paketcodecs.