Introduktion till programmering SMD180. Föreläsning 11: Filer och undantag

Relevanta dokument
Den klassiska programmodellen. Introduktion till programmering D0009E. Föreläsning 11: Filer och undantag. Filsystem. Interaktiva program.

Språket Python - Del 2 Grundkurs i programmering med Python

729G04 Programmering och diskret matematik. Föreläsning 7

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

Introduktion till programmering SMD180. Föreläsning 8: Listor

Sammanfattning. Listor. List-manipulering. Matris. /home/lindahlm/activity-phd/teaching/11dd1310/exercise3/exercise3.py September 13, 20111

Föreläsning 18 Filer och avbildningar

Introduktion till programmering D0009E. Föreläsning 9: Tupler och dictionaries

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Python. Datatyper. Mer om datatyper. Heltal - 3 Flyttal - 2,456 Listor - [1,2,3,4] Strängar - spam!

Ordlistor, filhantering och ut på webben. Linda Mannila

DD1314 Programmeringsteknik

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

Föreläsning 4 Programmeringsteknik DD1310. Felhantering. Syntax. try och except är reserverade ord som används för hantering av exekverings fel.

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Introduktion till programmering SMD180. Föreläsning 9: Tupler

Introduktion till programmering SMD180. Föreläsning 7: Strängar

Föreläsning 6 Programmeringsteknik och Matlab DD1312

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Språket Python - Del 1 Grundkurs i programmering med Python

Filer. DA2001 (Föreläsning 16) Datalogi 1 Hösten / 19

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

729G74 IT och programmering, grundkurs. Tema 3. Föreläsning 2 Jody Foo,

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Programmeringsteknik med C och Matlab

729G04 Programmering och diskret matematik. Python 3: Loopar

Selektion och iteration

Föreläsning 13 Datalogi 1 DA2001

Pythons standardbibliotek

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Repetition av filer Grundkurs i programmering med Python

Föreläsning 2 Programmeringsteknik och C DD1316

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Skapa hashtabell. En hashtabell kan ses som en lista där programmeraren associerar egna nycklar (index) till varje element som ska läggas i tabellen :

Grundläggande datalogi - Övning 1

Programmering och algoritmiskt tänkande. Tema 3, föreläsning 1 Jody Foo

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Multipel tilldelning. Introduktion till programmering D0009E. Föreläsning 6: Iteration. while-satsen. Kom ihåg. Snurror kontra rekursion

TDP002 - Imperativ programmering

Laboration: Whitebox- och blackboxtesting

Tentamen i Introduktion till programmering

TDDE44 Programmering, grundkurs

Läsöversikt. Föreläsningar 2-6. Genomförande av laborationer

729G04 Programmering och diskret matematik

Att skriva till och läsa från terminalfönstret

Skolan för Datavetenskap och kommunikation PROGRAMMERINGSTEKNIK FÖRELÄSNING 18

Sätt att skriva ut binärträd

Några saker till och lite om snabbare sortering

Övningsuppgifter kapitel 8

Övning 6. Ali Tofigh 24 Oktober, 2006

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Datalogi, grundkurs 1

Datalogi för E Övning 3

729G04 Programmering och diskret matematik. Python 2: Villkorssatser, sanningsvärden och logiska operatorer

Föreläsning 7: Filer

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Repetition i Python 3. Exemplen fac. Exemplen fac motivering. Exemplen fac i Python

Objektorienterad Programmering (TDDC77)

Övning2. Variabler. Data typer

Föreläsning 6: Introduktion av listor

Funktioner. Linda Mannila

Numeriska Metoder och Grundläggande Programmering för P1, VT2014

Klassdeklaration. Metoddeklaration. Parameteröverföring

Dataabstraktion. TDDD73 Funktionell och impterativ programmering i Python Föreläsning 12. Peter Dalenius Institutionen för datavetenskap

Tentamen. 5DV105, Programmeringsteknik med Python och Matlab 5DV106, Programmering i Python. 27 oktober 2009

TDIU01 - Programmering i C++, grundkurs

Introduktion till programmering SMD180. Föreläsning 3: Funktioner

Idag: Centrerad utskrift. Granskning. DD1311 Programmeringsteknik med PBL. Granskning Felhantering GUI. Föreläsning 15.

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Föreläsning 3: Booleans, if, switch

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Planering av ett större program, del 2 - for och listor. Linda Mannila

Föreläsning 3 Programmeringsteknik och C DD1316. Innehåll i listor. Uppdateringsoperatorer. +,* och listor. Listor. Indexering

Uppgifter teknik HT17 (uppdaterad v. 40)

TDP002 - Imperativ programmering

Använda Python Laboration 1 GruDat, DD1344

Datastrukturer. Erik Forslin. Rum 1445, plan 4 på Nada

PROGRAMMERINGSTEKNIK FÖRELÄSNING 5

729G04 Programmering och diskret matematik

Objektorienterad programmering Föreläsning 11. Copyright Mahmud Al Hakim

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python TDDE24 Funktionell och imperativ programmering del 2

Användarhandledning Version 1.2

Tilpro Övning 1. Per-Anders Staav (föredrar att kallas Pa) Kan nås via epost: (fast de flesta frågor besvaras nog bäst av Alexander)

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Dataabstraktion. TDDD73 Funktionell och imperativ programmering i Python Föreläsning 12. Peter Dalenius Institutionen för datavetenskap

Sekvensdatatyper, ASCII och chiffer. Linda Mannila

TDDC74 Lab 02 Listor, sammansatta strukturer

Imperativ och Funktionell Programmering i Python #TDDD73. Fredrik Heintz,

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Introduk+on +ll programmering i JavaScript

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

Transkript:

Introduktion till programmering Föreläsning 11: Filer och undantag 1 1

Den klassiska programmodellen Hur kan data överleva en programkörning? indata utdata Program A indata utdata Program B Filsystem tid 2 2

Interaktiva program Hur kan data överleva en programkörning? indata utdata indata utdata Filsystem tid 3 3

Filsystem Består av en mängd filer organiserade i en ofta hierarkisk struktur Varje fil har ett namn och ett innehåll (samt eventuella övriga detaljer såsom läs- och skrivrättigheter) Interna noder i filstrukturen kallas kataloger (directories) eller mappar (folders) ej att förväxla med Pythons inbyggda datatyp kataloger (dictionaries) En fils plats i filstrukturen bestäms av namnet. Exempel: /usr/share/dict/words betyder filen words i katalogen dict som ligger i katalogen share i katalogen usr på systemets toppnivå 4 4

Filer Filer kan betraktas som böcker: De måste öppnas före de kan läsas eller skrivas De läses (eller skrivs) oftast från pärm till pärm, men det är också möjligt att hoppa omkring på andra vis Att blanda läsning med skrivning är mer komplicerat än att bara läsa (eller bara skriva) Allra sist ska de stängas Att öppna filen test.dat för skrivning: f = open("test.dat", "w") Denna operation skapar filen test.dat om den inte redan finns, i annat fall krymps den till storlek 0 5 5

Filobjekt Resultatet av en lyckad öppning är ett filobjekt en intern datastruktur som fungerar som "handtag" till den egentliga filen För att skriva data används filobjektets write-metod: f.write("now is the time") f.write("to close the file") Efter stängning blir filen tillgänglig för andra att läsa f.close() Att öppna filen test.dat för läsning: f = open("test.dat", "r") Denna file måste finnas, annars sker ett runtime-fel 6 6

Filläsning Metoden read ger filens hela innehåll som en sträng: >>> text = f.read() >>> print text Now is the timeto close the file >>> f.close() Alternativ read där antalet önskade tecken också anges: >>> f = open("test.dat", "r") >>> print f.read(5) Now i >>> print f.read(1000006) s the timeto close the file >>> print f.read(), >>> 7 7

Filkopiering Kopierar filen oldfile till filen newfile def copyfile(oldfile, newfile): f1 = open(oldfile, "r") f2 = open(newfile, "w") while True: text = f1.read(50) if text == "": break f2.write(text) f1.close() f2.close() OBS: ny sats break bryter närmast yttre snurra 8 8

Filtyper De flesta filer i Unix-baserade filsystem är textfiler, dvs innehållet är bitmönster som representerar text enligt samma kodning som Python använder för strängar Textfiler kan i sin tur ha olika struktur och syntax en fil kan vara Python programtext, en annan ett epostmeddelande, en tredje en webbsida i html, etc Filer som inte är textfiler är antingen rena maskinkodfiler (körbara program) eller s k binära filer enligt något annat specialiserat dataformat (exempelvis bilder i jpegformat, filmer i mpeg-format). Binära filer kommer inte att behandlas ytterligare i denna kurs. Ofta (men inte alltid) avspeglas filtypen i filnamnet: Python-filer (.py), mpeg-filer (.mpeg), etc 9 9

Textfiler Underliggande struktur som går igen i alla textfiler (oberoende av format): en textfil är organiserad som en följd av rader En ny rad markeras av att ASCII-tecknet nyrad ('\n') ligger insprängt i texten Låt oss skapa en textfil med tre rader: f = open("test.dat", "w") f.write("line one\nline two\nline three\n") f.close() Vi förstår det som att varje rad slutar med tecknet '\n', utom möjligtvis filens sista rad 10 10

Radläsning Filmetoden read() ger som sagt hela innehållet som en sträng. Ofta kan det vara bättre att läsa en rad i taget: >>> f = open("test.dat", "r") >>> print f.readline() line one >>> print f.readline() + f.readline() line two line three >>> print f.readline()=="" True 11 11

Radläsning Metoden readlines() ger filens (kvarvarande) innehåll som en lista av rader: >>> f = open("test.dat", "r") >>> print f.readlines() ['line one\012', 'line two\012', 'line three\012'] >>> print f.readlines() [] Observera: print snyggar bara till sådana strängar som anges direkt som argument (tar bort ", skriver riktiga nyrad, etc). Strängar som ingår i sammansatta data (som listor) skrivs ut på samma sätt som de läses in i Python (Av historiska skäl skrivs \-koderna här med basen 8) 12 12

Filkopiering med filtrering Kopiera oldfile, men skippa rader som inleds med # def filterfile(oldfile, newfile): f1 = open(oldfile, "r") f2 = open(newfile, "w") while True: text = f1.readline() if text=="": break if text[0]=='#': continue f2.write(text) f1.close() f2.close() Ny sats: continue hoppar till nästa varv i en snurra 13 13

Filkopiering med filtrering Alternativ formulering, nu med for-snurra: def filterfile(oldfile, newfile): f1 = open(oldfile, "r") f2 = open(newfile, "w") for text in f1: if text[0]!= '#': f2.write(text) f1.close() f2.close() Filer kan alltså också betraktas som sekvenser på samma sätt som listor, strängar och tupler. Elementen i en filsekvens är filens rader 14 14

Textformatering Att ha möjligheten att skriva text är gott och väl, men ska andra typer av värden sparas på textfiler måste de först konverteras till strängar Detta kan göras med den inbyggda konverteringsfunktionen str() kombinerat med konkatenering: num = 73 value = 3.14 f.write( "Row " + str(num) + ": = " + str(value) ) Python erbjuder dock ett mycket behändigt alternativ: operatorn % i en ny betydelse som formateringsoperation! (% betyder som bekant modulus när den appliceras på heltal) 15 15

Formateringsoperatorn % Operatorn % applicerad på en strängmall och en tupel med värden producerar en kopia av mallen där markerade "hål" har ersatts med värden från tupeln: 'abchål1defhål2gh...ijhålnklm' ( v1, v2,..., vn ) % 'abcv1defv2gh...ijvnklm' Underförstått: v1, v2,..., vn konverteras till strängformat innan de sätts in på motsvarande plats i mallen 16 16

Hål En ny form av escape-sekvens (hanteras dock i run-time) heltalsvärde %d flyttalsvärde %f strängvärde %s Exempel: >>> 'In %d days we made %f million %s' % (34, 6.1, 'dollars') 'In 34 days we made 6.100000 million dollars' Observera att flyttal skrivs ut med 6 decimaler (default) 17 17

Mer om formateringsoperatorn Felaktig användning: >>> ' %d %d %d' % (1, 2) TypeError: not enough arguments for format string >>> ' %d' % 'dollars' TypeError: int argument required Ok, om än lite förvirrande: >>> ' %s' % 37 '37' Underförstådd betydelse av föregående exempel: >>> ' %s' % str(37) '37' 18 18

Ytterligare kontroll av formatet Önskat minsta antal tecken (fyll ut med mellanslag): >>> ' %6d' % 62 ' 62' >>> ' %-6d ' % 62 '62 ' >>> ' %12f ' % 6.1 ' 6.100000 ' Önskat antal decimaler för flyttal: >>> ' %12.2f ' % 6.1 ' 6.10' 19 19

Exempel Funktion som skriver ut en lönerapport (given som ett dictionary) i en tabell med två kolumner: def report(wages, file): f = open(file, "w") people = wages.keys() people.sort() for x in people: f.write( '%-20s %12.2f ' % (x, wages[x]) ) f.close() Notera: koden är egentligen inte beroende av att det är just namn och löner som skrivs ut alla dictionaries som mappar strängar till flyttal är ok! 20 20

Exempel Testkörning: wages = {'mary' : 10.23, 'joe' : 5.45, 'josh' : 4.25} report(wages, "test.dat") Genererat innehåll i filen test.dat: joe 5.45 josh 4.25 mary 10.23 Rapporten ser ok ut så länge namnen är kortare än 20 tecken och lönerna har färre än 9 siffror + 2 decimaler Alltså, formatsträngen '%-20s %12.2f ' 21 21

Sammansatta data Tyvärr fungerar formateringsoperatorn bara för de primitiva typerna, ej för sammansatta data som listor Här får i stället funktionen str() användas: f.write( str([1,2,3]) ) f.write( str({'x' : 2, 'y' : 3}) ) Ett intressant problem uppstår dock om vi vill kunna läsa in filen f vid ett senare tillfälle, och återskapa de sammansatta värdena. Betrakta den genererade texten: '[1,2,3]{'x': 2, 'y': 3}' Hur ska vi angripa en sådan sträng? Tecken för tecken? Hur vet vi var ett värde slutar och ett annat börjar? 22 22

Modulen pickle Lösning: om vi mest är intresserade av att kunna spara undan data på fil för att sedan kunna läsa in dem, och inte har några åsikter om hur den genererade texten egentligen ser ut, så erbjuder Python modulen pickle Pickle bedtyder (salt-)inläggning, och det är så vi ska se den sparade texten: som en inläggning av godtyckliga data för att "öka hållbarheten" mellan programkörningar Skriver en textkodning av värdet x på filen f: pickle.dump( x, f ) Avkodar nästa värde i filen f och returnerar det: x = pickle.load( f ) 23 23

Exempel Kod som lägger in data i filen test.dat: import pickle f = open("test.dat", "w") pickle.dump( [1,2,3], f ) pickle.dump( {'x': 2, 'y': 3}, f ) f.close() Kod (kanske i ett annat program) som läser in dessa data: import pickle f = open("test.dat", "r") list = pickle.load( f ) dict = pickle.load( f ) f.close() 24 24

Runtime-fel vi stött på Division med 0 >>> print 55/0 ZeroDivisionError: integer division or modulo Indexering utanför en lista: >>> a = [] >>> print a[5] IndexError: list index out of range Uppslagning av obefintlig nyckel i ett dictionary: >>> b = {} >>> print b['what'] KeyError: what 25 25

Runtime-fel vi stött på Försök att öppna en icke existerande fil: >>> f = open("i.dont.exist", "r") IOError: [Errno 2] No such file: 'I.dont.exist' Referens av odefinierad variabel: >>> print kalle NameError: name 'kalle' is not defined Anrop av funktion med fel antal argument: >>> def f(x,y): return x+y >>> print f(3) TypeError: f() takes exactly 2 arguments (1 given) 26 26

Undantag Alla dessa runtime-fel är exempel på s k undantag (exceptions), och de karaktäriseras av ett namn (TypeError, IndexError, etc) och en beskrivande text Normalt beteende då ett undantag uppstår: avsluta programkörningen och skriv ut information om undantaget Det är dock möjligt att hantera undantag själv också, med hjälp av try-satsen: try: satslista except namn: Kan upprepas för olika namn satslista 27 27

Exempel Hantering av det fall att en namngiven fil inte finns: filename = raw_input('enter a file name: ') try: f = open(filename, "r") except IOError: print "There is no file named", filename Variant på idén, nu som funktion: 28 def exists(filename): try: f = open(filename) f.close() return True except IOError: return False 28

Att generera undantag Använd satsen raise namn, beskrivning: def inputnumber(): x = input('pick a number: ') if x == 17: raise ValueError, '17 is a bad number' return x Vid körning: >>> inputnumber() Pick a number: 17 ValueError: 17 is a bad number >>> 29 29

Att generera undantag Undantaget NotImplementedError är lämpligt att använda om man vill definiera halvfärdiga funktioner: def myfun(x, y): if x > y: return x-y else: raise NotImplementedError, 'myfun' Övriga fördefinierade undantag kan också användas i raise, och det är t o m möjligt att skapa egna namn Undantag genererade med raise kan naturligtvis också fångas med try (vanligt i större program) 30 30