Göm menyn

Extramaterial: Enklare skript

Innehåll

Inledning

Python

Bilden ovan är lite tramsig, men ganska talande. Dels illustrerar den hurpass (relativt) lätt syntax det är i Python. Dels pekar den på mängden färdiga moduler. Det är inte riktigt så att man kan flyga genom att skriva import antigravity, men det finns enkelt stöd för många saker. Vill man läsa in data från en del format, finns det alltså färdigt stöd för det. Vill man behandla text finns det stöd för det. Vill man hämta data från webbtjänster, eller leta mönster, finns det stöd för det. Det är inte världens bästa språk för alla ändamål, men det är bland annat populärt för att skriva skript som gör anrop, samlar ihop data från olika håll, och sammanställer det.

Uppbyggnad

I denna extralabb kommer vi att bygga upp mot att lösa STONE-slutuppgifterna i Python (utan att använda möjligheterna att anropa program utanför Pythonmiljön). Det innebär att man på vägen stöter på filläsning, att skriva pythonskript som kan köras direkt från terminalen och att lära sig leta efter information. Därefter kan man börja behandla data från andra källor om man så önskar.

Förkunskaper, stil

Labben kommer att vara lite mer självständig i termer av att du får leta upp kommandon själv. Det är också mest för att ge en struktur för hur man letar, och vad man kan tänkas vilja leta efter. Det finns såväl böcker som siter som förklarar varje del i mycket större detalj.

Du förutsätts inte kunna mer än det som lärs ut i början av laboration 1. Tupler och dictionaries kan också vara användbara. Övningarna är delvis gjorda så att det ska vara lätt att lyfta ut delar till högre ordningens procedurer, när man läst om det.

Inte examinerande

Detta är extramaterial. Du behöver inte göra det för att klara labbserien. Du kommer inte få fler högskolepoäng för att du löser det. Ett väl utfört arbete skänker dock en inre frid, och är den grund uppå vilken samhället vilar.

Att göra Python-skript körbara

När vi skrev enkla shellskript, talade vi om först vad man ska få att tolka skriptet (/bin/bash t ex), och sedan koden. Därefter markerade vi att filen skulle vara körbar (med chmod). Det ser likadant ut från command line.

#!/bin/bash echo Hello world

#!<här matar vi in vilken pythoninterpretator som ska köras> print('Hello world')

Övning Skriv ett Hello world-skript.

Tips Du kan få fram det du syftar på när du skriver python3 i terminalen med hjälp av /usr/bin/env python3.

[Visa/dölj tips]

Svar

#!/usr/bin/env python3 print('Hello world')

Glöm inte att göra skriptet körbart (t ex chmod u+x helloworld.py).

[Visa/dölj lösningsförslag]

Inmatning från command line (och hjälpletande)

I shellskripten kunde man skriva mittskript argument1 argument2 argument3, och på något sätt använda det som matades in. Försök att få Python-programmet att göra det.

Övning Skriv ett Hello world-skript.

andma54@li0-2:kurs/python/extralabb$ greet.py Tesco Hello Tesco!

En del i den här övningen är att lära sig leta information i dokumentation och på nätet. Det du är ute efter är typiskt sett argument till programmet, något modell "command line arguments". Ett bra ställe att börja är Pythons officiella referens och tutorials (docs.python.org). Stack Overflow kan också innehålla bra information. Ofta hjälper det att snegla på kodexemplen i hjälpen, om man inte förstår alla begrepp innan.

OBS! Om du hittar svar eller sökresultat, kan det hända att de är i Python 2.x. Kolla noga (står det print utan parenteser är det troligen fel version). På Pythons officiella sida brukar det finnas en dropdown-meny långt upp till vänster där det står vilken språkversion sidan gäller. Där kan man välja att få motsvarande information för andra versioner.

Tips sys-modulen kan vara användbar. Vill man hantera flaggor och inställningar, kan argparse (se HOWTO-sidan) vara av intresse. Men inte nu.

[Hello world - Visa/dölj tips 1]

Lösningsförslag Ett hastigt hopskrivet skript (OBS! Utan någon vettig hantering av felaktig/bristande indata! Skriv egen!) är

#!/usr/bin/env python3 import sys name = sys.argv[1] print('Hello', name, '!')

[Hello World - Visa/dölj lösningsförslag]

Under Windows kan du köra skriptet ovan med python greet.py Anders (förutsatt att katalogen där du installerat Python finns med i PATH). Förstaraden kommer räknas som en kommentar av Python, så det bör inte ställa till problem att testa hemma.

Att skilja på körning som skript och inladdning

Det kan vara användbart för testningssyften (och mycket annat) att skriva program som anpassar sig efter hur man anropar dem, eller hur de körs. Ett standardsätt att göra detta är att fråga

if __name__ == '__main__': run_heavy_calculation() else: print('Jag är inladdad, t ex med "import greet". Testa t ex att felsöka funktioner i modulen.')

Det finns en del mer att säga om detta, men det är ett praktiskt trick.

Övning Skriv om greet.py så att den inte försöker kolla i sys.argv om man inte kör programmet från command line (och har en förväntan om att det ska finnas något där).

Att läsa filer

Detta nämns vid föreläsningar, men är användbart att gå igenom i detta sammanhang.

Liksom andra saker är filströmmar i Python itererbara. Det svarar ungefär mot "saker man kan använda for till".

Läs Hitta Pythondokumentationen om läsande och skrivande av filer, och (skum)läs igenom den. Notera särskilt det om with open....

Övning Hämta slutuppgift textfil 2. Gör en funktion som tar ett filnamn, och går igenom varje rad i den filen och skriver ut dess innehåll på skärmen (rad för rad).

Övning Gör ett Pythonskript av det ovan, där användaren kan skriva

andma54@li0-2:kurs/python/extralabb$ printcontents.py studenter.txt

med samma utdata som från motsvarande cat. Se till att den fungerar vettigt om användaren inte matar in korrekt indata, och om filen inte finns.

.

Enklare textbehandling (och att läsa Python-hjälp)

Det finns många standardmetoder i Python för att dela upp och sätta ihop text. Ofta är funktionsnamn och hjälp rätt lättläst.

Tips Funktionen dir ger information om vilka funktioner som hänger med en viss modul eller objekt, help ger ofta hjälp. Låt säga att vi är intresserade av att omvandla en textsträng till versaler. Detta är en typisk sådan sak som någon kan ha användning för i enklare skript, så det kan finnas stöd för det i språket.

>>> dir("en sträng") ['__add__', ... , 'capitalize', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] >>> help("en sträng".upper) Help on built-in function upper: upper(...) S.upper() -> str Return a copy of S converted to uppercase.

Övning Gör en Pythonfunktion som tar en rad ur studenter.txt, modell andan100:Anders:Andersson:800101-1234:TNCCC_1:TDDB46 TDDB80: och returnerar den information som behövs för att lösa uppgiften, i lämpligt format. Returvärdet här kan t ex vara tupeln ("andan100","Andersson","Anders"), eller - kanske hellre - en dictionary med rimliga nyckelnamn.

Ledning <sträng>.split(":") är praktisk.

[Visa/dölj ledning]

Övning Gör ett Pythonskript som går igenom studenter.txt och samlar alla tupler modell ("andan100","Andersson","Anders") (eller motsvarande dictionaries) i en lista. Få sedan listan sorterad på efternamn (OBS! Du får gärna skriva egen sortering, men behöver inte göra det.)

Övning Sätt ihop det hela till ett Pythonskript som kan köras från commandline, tar ett argument och skriver ut informationen på sättet som förväntas i STONE-uppgift 2.

Övning Skriv ett Pythonskript som går igenom en fil som studenter.txt och räknar hur många som läser en viss kurs. Skriv sedan ut statistiken på formen KURSKOD: antal (en per rad).

Reguljära uttryck

Reguljära uttryck kan användas till mycket. Python-modulen re är användbar här. Läs på om pattern-objekt och slagningar i Regular Expression HOWTO. (Referenssidan 6.2. re — Regular expression operations kan också vara praktisk.)

Övning Skriv en Pythonfunktion som tar en textrad som den i slutuppgift 1 (schemauppgiften) som testar om en viss rad bör finnas med i utskrift från filen. Inparametrar till funktionen bör vara textsträngen, årskurs (t ex C1), klass (t ex B) och grupp (t ex 3). Det intressanta här är alltså om det finns någon matchning.

Övning Skriv en Pythonfunktion som tar en textrad (modell den i slutuppgift 1) och samlar alla LiU-id i en lista. Kontrollera att din funktion klarar rader där det förekommer flera LiU-id/matchningar.

Vidareläsning

Ett par tankar om saker som kan vara intressanta att läsa vidare om ett tag senare (detta kan kräva lite mer arbete):

  • os och subprocess. Kommunicera med operativsystemet utanför, kör kommandon och så vidare. Notera att detta är 'på riktigt', så på samma sätt som du exempelvis kan ta bort egna filer med hjälp av shellskript, kan du göra konstigheter här.
  • urllib.request. Hämta data från nätet, koppla upp sig mot öppna datakällor (som trafikinfo för många företag).
  • json. Behandla data från dylika källor.

Materialet ursprungligen sammanställt av Anders Märak Leffler 2014.


Sidansvarig: Peter Dalenius
Senast uppdaterad: 2014-10-03