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.clientundxmlrpc.servermachen 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
emailpackage is a library for managing email messages, including MIME and other RFC 2822-based message documents. Unlikesmtplibandpoplibwhich 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
jsonbietet umfassende Unterstützung für die Analyse dieses gängigen Datenaustauschformats. Das Modulcsvunterstü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 Paketexml.etree.ElementTree,xml.domundxml.saxunterstützt. Zusammen vereinfachen diese Module und Pakete den Datenaustausch zwischen Python-Anwendungen und anderen Tools erheblich.Das Modul
sqlite3ist 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,localeund das Paketcodecs.