TDP002 - Imperativ programmering Pythons standardbibliotek Pontus Haglund Institutionen för datavetenskap Anpassat från amterial ursprungligen av: Eric Elfving
1 Felhantering 2 Standardbiblioteket Slump Datum och tid Datalagring Konfigurationsdata Kommandoraden Lösenordsinmatning Operativsystem Http Loggning
1 Felhantering 2 Standardbiblioteket Slump Datum och tid Datalagring Konfigurationsdata Kommandoraden Lösenordsinmatning Operativsystem Http Loggning
3 / 33 Felhantering Python baseras på "Duck Typing". When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.
4 / 33 Felhantering Detta leder till att vi kommer få fel som måste hanteras. >>> int('fem') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: 'Fem' Här ser vi exempel på undantag (exceptions) Direkt ett undantag kastas avbryts nuvarande körning och vi hoppar till närmsta hanterare Finns ingen hanterare avbryts programmet (programmet "krashar")
5 / 33 Felhantering En hanterare introduceras med ett try-block try: val=int(input('mata in ett tal: ')) except: print('skulle vara ett heltal!')
6 / 33 Felhantering Vi kan hantera olika fel på olika sätt. try: 1/a except TypeError: print('a har fel typ!') except NameError: print('a finns inte!') except ZeroDivisionError: print('kan inte dela med 0!') except: print('annat fel') Likt if-satsen är det den första som stämmer som vi går in i.
7 / 33 Felhantering Vi kan hantera flera olika fel på samma sätt. try: 1/a except (TypeError, NameError): print('a är dålig!') except ZeroDivisionError: print('kan inte dela med 0!') except: print('annat fel')
8 / 33 Felhantering Vi kan kasta undantag. >>> raise NameError('Hejsan') Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: Hejsan
9 / 33 Felhantering Mer läsning: https://docs.python.org/3/tutorial/errors.html
1 Felhantering 2 Standardbiblioteket Slump Datum och tid Datalagring Konfigurationsdata Kommandoraden Lösenordsinmatning Operativsystem Http Loggning
11 / 33 Slumphantering Ibland vill man få kod att uppföra sig slumpmässigt Datorer har svårt att ge riktig slump men många språk har pseudo-slump (en algoritm beräknar ett "slumpat'' värde) Självklart finns det även i Python - modulen random
http://docs.python.org/3/library/random.html 12 / 33
13 / 33 Datumhantering Med hjälp av modulen datetime kan man på ett enkelt sätt hantera datum och tider i Python. Det finns tre huvudtyper i modulen: date, time och datetime (finns även typer för tidsskillnader och tidszoner)
http://docs.python.org/3/library/datetime.html 14 / 33
15 / 33 Lagring av data Textfiler är bra för att lagra data mellan körningar Det kan dock ställa till med problem Hur ska jag formatera datat? Vad händer om något är felformaterat? Med hjälp av pickle kan man på ett enkelt sätt dumpa data till en fil för att sedan läsa in det igen
16 / 33 res = {'Kalle': 4, 'Anna': 5} file_name = 'resultat' with open(file_name, 'wb') as f: pickle.dump(res, f) http://docs.python.org/3/library/pickle.html
17 / 33 Lagring av data pickle går inte alltid att lita på... Använd endast data som du själv sparat ner eller från någon du litar på! Warning: The pickle module is not intended to be secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source.
18 / 33 Lagring av data CSV Comma Separated Values Används ofta för att exportera tabelldata i flera olika program Har tyvärr ingen generell standard men kolumnvärden lagras ofta separerat med en specifik separator (ofta komma) import csv with open('fil.csv') as f: reader = csv.reader(f) for row in reader: print(row) 1, 3, 6 12, 7, 6 Listing 1: fil.csv http://docs.python.org/3/library/csv.html
19 / 33 Lagring av data json JavaScript Object Notation Ett transportformat baserat på javascript Används väldigt mycket på www Modulen json har ett gränssnitt som liknar pickle
20 / 33 Lagring av data json http://docs.python.org/3/library/json.html
21 / 33 Konfigurationsfiler Med hjälp av konfigurationsfiler kan användare ändra på ditt programs funktionalitet utan att ändra i källkoden Modulen configparser kan läsa filer på INI-formatet Skapa en fil: http://docs.python.org/3/library/configparser.html
22 / 33 Konfigurationsfiler http://docs.python.org/3/library/configparser.html
23 / 33 Kommandoradsargument I de flesta programmeringsspråk kan man skicka värden till programmet när man startar det. Detta kallas kommandoradsargument. Det "lättaste" sättet att få reda på kommandoradsargumenten är med hjälp av sys.argv. Det är en lista där varje element motsvarar ett argument.
24 / 33 Kommandoradsargument #! /usr/bin/env python3 # * coding: utf 8 * import sys for arg in sys.argv: print(arg) $ chmod +x args.py $ python3 args.py args.py $./args.py Hej mitt lilla program!./args.py Hej mitt lilla program!
25 / 33 Kommandoradsargument argparse Man kan även använda sig av modulen argparse Med argparse väljer man vilka flaggor och argument man väntar sig och sedan sköter modulen tolkningen - man slipper kontrollera och konvertera listelementen! http://docs.python.org/3/library/argparse.html
26 / 33 Kommandoradsargument argparse
27 / 33 Lösenordshantering Ibland vill man be användare mata in lösenord Vanligtvis använder vi input för indata men då kan ju andra se vad jag matar in Modulen getpass är bra Likt input kan man ge en ledtext (normalt sätt skrivs 'Password: ' ut) import getpass pwd = getpass.getpass() Det finns även en funktion getuser som tar reda på vem man är inloggad som http://docs.python.org/3/library/getpass.html
28 / 33 Operativsystemsanrop subprocess Ett anrop till ett systemkommando (eller ett annat program) kan göras med subprocess.call. Vi får ett returvärde som bör vara 0 om det gått bra. Som parameter tar call en lista som liknar sys.argv >>> subprocess.call(["ls", " l"]) 0 >>> subprocess.call(["cat", "fil_som_inte_finns"]) 1 Vill vi komma åt utskrifter från program kan man använda sig av check_output >>> subprocess.check_output(["echo", "Hello World"]) b'hello World\n'
29 / 33 Modulen os Modulen os har operativsystemsspecifika funktioner Vissa av funktionerna fungerar endast för specifika operativsystem men de flesta fungerar lika oberoende av operativsystem Några bra funktioner: os.environ En dict-liknande typ som innehåller Pythons miljövariabler os.listdir(path) Utför ls i mappen path, ger en lista som resultat os.mkdir Skapar mapp http://docs.python.org/3/library/os.html
30 / 33 os.path os.path är en undermodul med funktioner för att hantera filnamn på ett generellt sätt. Exempel: os.path.join(p1,p2) som slår samman sökvägarna p1 och p2 med ett för nuvarande operativsystems bra sätt (med avsende på separator, '/' i Linux och '\' i windows) os.path.isfile(f) kontrollerar om f är en fil os.path.abspath(path) gör om path till en absolut sökväg http://docs.python.org/3/library/os.path.html
31 / 33 Webåtkomst urllib Med urllib kan man komma åt information från webben I modulen urllib.request finns en funktion urlopen som laddar en sida och ger ett fil-liknande värde som kan hanteras som en textfil http://docs.python.org/3/library/urllib.html
32 / 33 Webåtkomst import urllib.request url="http://www.ida.liu.se" with urllib.request.urlopen(url) as page: for line in page: if '<title>' in line: title = line.split('<title>') title = title[1].split('</') title = title[0] print(line) break... <title>ida > Home</title>... IDA > Home
33 / 33 Loggning logging Med logging kan man på ett enkelt sätt logga information om sin körning till fil import logging logging.basicconfig(filename='example.log', level=logging.info) logging.debug('this does not go to the log file') logging.info('but this should') logging.warning('and this, too') INFO:root:But this should WARNING:root:And this, too Finns stöd för eget format (t.ex. tidsstämplar) http://docs.python.org/3/library/logging.html
www.liu.se