10. Kort rundtur i standardbiblioteket¶
10.1. Operativsystemets gränssnitt¶
Modulen os
innehåller dussintals funktioner för att interagera med operativsystemet:
>>> 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
Var noga med att använda import os
-stilen istället för from os import *
. Detta förhindrar att os.open()
skuggar den inbyggda open()
-funktionen som fungerar på ett helt annat sätt.
De inbyggda funktionerna dir()
och help()
är användbara som interaktiva hjälpmedel för att arbeta med stora moduler som 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 daglig fil- och kataloghantering tillhandahåller modulen shutil
ett gränssnitt på högre nivå som är enklare att använda:
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
'archive.db'
>>> shutil.move('/build/executables', 'installdir')
'installdir'
10.2. Jokertecken för filer¶
Modulen glob
tillhandahåller en funktion för att skapa fillistor från katalogsökningar med jokertecken:
>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']
10.3. Argument på kommandoraden¶
Vanliga verktygsskript behöver ofta bearbeta kommandoradsargument. Dessa argument lagras i modulen sys
attribut argv som en lista. Låt oss till exempel ta följande demo.py
file:
# File demo.py
import sys
print(sys.argv)
Här är utdata från att köra python demo.py one two three
på kommandoraden:
['demo.py', 'ett', 'två', 'tre']
Modulen argparse
tillhandahåller en mer sofistikerad mekanism för att bearbeta kommandoradsargument. Följande skript extraherar ett eller flera filnamn och ett valfritt antal rader som skall visas:
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)
När skriptet körs på kommandoraden med python top.py --lines=5 alpha.txt beta.txt
, sätts args.lines
till 5
och args.filenames
till ['alpha.txt', 'beta.txt']
.
10.4. Omdirigering av felutgång och programavslutning¶
Modulen sys
har också attribut för stdin, stdout och stderr. Det senare är användbart för att avge varningar och felmeddelanden så att de blir synliga även när stdout har omdirigerats:
>>> sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one
Det mest direkta sättet att avsluta ett skript är att använda sys.exit()
.
10.5. Matchning av strängmönster¶
Modulen re
tillhandahåller verktyg för reguljära uttryck för avancerad strängbehandling. För komplex matchning och manipulation erbjuder reguljära uttryck kortfattade, optimerade lösningar:
>>> 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'
När det bara behövs enkla funktioner är strängmetoder att föredra eftersom de är lättare att läsa och felsöka:
>>> 'tea for too'.replace('too', 'two')
'tea for two'
10.6. Matematik¶
Modulen math
ger tillgång till de underliggande C-biblioteksfunktionerna för flyttalsmatematik:
>>> import math
>>> math.cos(math.pi / 4)
0.70710678118654757
>>> math.log(1024, 2)
10.0
Modulen random
innehåller verktyg för att göra slumpmässiga urval:
>>> 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
Modulen statistics
beräknar grundläggande statistiska egenskaper (medelvärde, median, varians etc.) för numeriska data:
>>> 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
SciPy-projektet <https://scipy.org> har många andra moduler för numeriska beräkningar.
10.7. Tillgång till internet¶
Det finns ett antal moduler för att komma åt Internet och hantera Internetprotokoll. Två av de enklaste är urllib.request
för att hämta data från URL:er och smtplib
för att skicka e-post:
>>> 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()
(Observera att det andra exemplet kräver en mailserver som körs på localhost)
10.8. Datum och tider¶
Modulen datetime
tillhandahåller klasser för att manipulera datum och tider på både enkla och komplexa sätt. Aritmetik för datum och tid stöds, men fokus för implementationen ligger på effektiv extrahering av medlemmar för formatering och manipulation av utdata. Modulen stöder också objekt som är medvetna om tidszoner.
>>> # 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. Komprimering av data¶
Vanliga format för dataarkivering och komprimering stöds direkt av moduler, inklusive: zlib
, gzip
, bz2
, lzma
, zipfile
och 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. Prestationsmätning¶
Vissa Python-användare utvecklar ett djupt intresse för att känna till den relativa prestandan hos olika metoder för samma problem. Python tillhandahåller ett mätverktyg som svarar på dessa frågor omedelbart.
Det kan till exempel vara frestande att använda funktionen för att packa och packa upp tuplar i stället för den traditionella metoden att byta argument. Modulen timeit
demonstrerar snabbt en blygsam prestandafördel:
>>> 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
I motsats till timeit
, som har en mycket hög detaljeringsgrad, ger modulerna profile
och pstats
verktyg för att identifiera tidskritiska avsnitt i större kodblock.
10.11. Kvalitetskontroll¶
En metod för att utveckla programvara av hög kvalitet är att skriva tester för varje funktion när den utvecklas och att köra dessa tester ofta under utvecklingsprocessen.
Modulen doctest
tillhandahåller ett verktyg för att skanna en modul och validera tester som är inbäddade i ett programs dokumentsträngar. Testkonstruktionen är så enkel som att klippa och klistra in ett typiskt anrop tillsammans med dess resultat i dokumentsträngen. Detta förbättrar dokumentationen genom att ge användaren ett exempel och gör det möjligt för doctest-modulen att se till att koden följer dokumentationen:
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
Modulen unittest
är inte lika enkel som modulen doctest
, men den gör det möjligt att underhålla en mer omfattande uppsättning tester i en separat fil:
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. Batterier ingår¶
Python har en ”batterier ingår”-filosofi. Detta märks bäst genom de sofistikerade och robusta funktionerna i de större paketen. Till exempel:
Modulerna
xmlrpc.client
ochxmlrpc.server
gör det nästan trivialt att implementera remote procedure calls. Trots modulernas namn behövs ingen direkt kunskap om eller hantering av XML.Paketet
email
är ett bibliotek för hantering av e-postmeddelanden, inklusive MIME och andra RFC 2822-baserade meddelandedokument. Till skillnad frånsmtplib
ochpoplib
, som faktiskt skickar och tar emot meddelanden, har e-postpaketet en komplett verktygslåda för att bygga eller avkoda komplexa meddelandestrukturer (inklusive bilagor) och för att implementera Internet-kodning och rubrikprotokoll.Paketet
json
ger robust stöd för parsning av detta populära datautbytesformat. Modulencsv
stöder direkt läsning och skrivning av filer i formatet Comma-Separated Value, som ofta används i databaser och kalkylblad. XML-bearbetning stöds av paketenxml.etree.ElementTree
,xml.dom
ochxml.sax
. Tillsammans förenklar dessa moduler och paket i hög grad datautbytet mellan Python-applikationer och andra verktyg.Modulen
sqlite3
är en omslagsmodul för databasbiblioteket SQLite, som tillhandahåller en beständig databas som kan uppdateras och nås med hjälp av SQL-syntax som inte är helt standardiserad.Internationalisering stöds av ett antal moduler, inklusive
gettext
,locale
och paketetcodecs
.